stl矢量内存管理

np-*_*ard 1 c++

我使用的是borland 2006 c ++,并且有以下代码.我正在使用向量,并且无法理解为什么没有调用析构函数.

基本上我有A级

class A
{
private:
    TObjectList* list;
    int myid;
public:
 __fastcall A(int);
 __fastcall ~A();
};

__fastcall A::A(int num)
{
    myid = num;
    list = new TObjectList();

}

__fastcall A::~A()
{
    delete list;
}

int main(int argc, char* argv[])
{
    myfunc();
    return 0;
}

void myfunc()
{
    vector<A*> vec;
    vec.push_back(new A(1));
    vec.push_back(new A(2));
}
Run Code Online (Sandbox Code Playgroud)

根据我读到的,当变量vec超出myfunc()中的范围时,它应该破坏其包含的元素,因此应该调用A的析构函数.我在~A()处有一个断点,但从未被调用过,我也尝试过resize(),擦除方法

TIA

Dav*_*ler 15

当vec超出范围时,它会破坏它的元素.这里的问题是vec的元素是A对象的指针,而不是A对象本身.如果你做了

vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));
Run Code Online (Sandbox Code Playgroud)

......那么事情会像你期望的那样奏效.

ETA:但是请注意,如果你这样做,你必须为A定义一个复制构造函数.这应该包括对TObjectList成员进行深层复制.否则,当您复制A对象时,您将使用指向同一TObjectList的两个对象,并且当第二个对象被销毁时您的程序将崩溃.

  • 作为旁注.在容器中使用指针时,不要尝试使用auto_ptr来进行销毁.由于复制方式,Auto_ptrs无法在STL容器内使用. (2认同)