2009-06-17 92 views
1

我使用borland 2006 C++,并且有以下代码。我正在使用矢量,并且无法理解为什么析构函数没有被调用。stl向量内存管理

基本上我有一个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()断点,但从来没有被调用,我已经尝试调整大小(),清除方法也

TIA

回答

15

VEC当它超出范围并销毁其元素。这里的问题是vec的元素是指针到A对象,而不是对象本身。如果你反而做

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

...然后事情会按预期工作。

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

+2

作为一个方面说明。不要尝试使用auto_ptr来在容器内使用指针时执行破坏。 Auto_ptrs无法在STL容器内使用,因为它们被复制的方式。 – 2009-06-17 19:45:43

3

A析构函数不叫,因为你没有的A的向量。你有一个指向A的指针向量,并且指针的析构函数被调用。指针没有析构函数,所以没有任何反应。删除一切

一种方式是手工做类似

while (!vec.empty()) 
{ 
    delete vec.back(); 
    vec.pop_back(); 
} 
1

抓住Boost库,并且无论你在有一个原始指针上面你使用boost :: shared_ptr的<>代替。 (哦,不是在main()的签名)

3

很多很好的答案已经,但我会增加一个:

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