簡體   English   中英

stl 矢量 memory 管理

[英]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 Libraryboost::ptr_vector ,而不是 std::vector。 當 vector 超出 scope 時,它將刪除對象,從而調用析構函數。

獲取 Boost 庫,在上面任何有原始指針的地方,都可以使用 boost::shared_ptr<> 代替。 (好吧,不在 main() 的簽名中。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM