[英]stl vector memory management
我正在使用 borland 2006 c++,並有以下代碼。 我正在使用向量,並且無法理解為什么不調用析構函數。
基本上我有一個 class 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() 中超出 scope 時,它應該破壞它包含的元素,所以應該調用 A 的析構函數。 我在 ~A() 處有一個斷點,但從未被調用,我也嘗試過 resize() 和擦除方法
TIA
vec 在超出 scope 時確實會破壞它的元素。這里的問題是 vec 的元素是指向A 對象的指針,而不是 A 對象本身。 如果你反而做了
vector<A> vec;
vec.push_back(A(1));
vec.push_back(A(2));
...那么事情就會如你所願。
ETA:不過請注意,如果你這樣做,你必須為 A 定義一個復制構造函數。這應該涉及對 TObjectList 成員進行深層復制。 否則,當您復制 A object 時,您將得到兩個指向同一個 TObjectList 的對象,並且當第二個 object 被銷毀時,您的程序將崩潰。
未調用A
的析構函數,因為您沒有A
的向量。 您有一個指向A
的指針向量,並且調用了指針的析構函數。 指針沒有析構函數,所以什么也不會發生。
刪除所有內容的一種方法是手動執行類似
while (!vec.empty())
{
delete vec.back();
vec.pop_back();
}
已經有很多好的答案,但我會再添加一個:
使用來自Boost Pointer Container Library的boost::ptr_vector ,而不是 std::vector。 當 vector 超出 scope 時,它將刪除對象,從而調用析構函數。
獲取 Boost 庫,在上面任何有原始指針的地方,都可以使用 boost::shared_ptr<> 代替。 (好吧,不在 main() 的簽名中。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.