stl矢量内存管理

时间:2009-06-17 19:40:56

标签: 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));
}

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

TIA

4 个答案:

答案 0 :(得分:15)

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

vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));

......然后事情会像你期望的那样奏效。

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

答案 1 :(得分:3)

由于您没有A的向量,因此未调用A的析构函数。你有一个指向A的指针向量,并且调用指针的析构函数。指针没有析构函数,所以没有任何反应。

删除所有内容的一种方法是手动执行类似

的操作
while (!vec.empty())
{
    delete vec.back();
    vec.pop_back();
}

答案 2 :(得分:3)

已经有很多好的答案,但我还要补充一点:

使用Boost Pointer Container Library中的 boost :: ptr_vector ,而不是std :: vector。当向量超出范围时,它将删除对象,从而调用析构函数。

答案 3 :(得分:1)

抓住Boost库,无论你在上面有一个原始指针,你都可以使用boost :: shared_ptr&lt;&gt;代替。 (好吧,不在main()的签名中。)