編輯:謝謝你的回答!我宣佈tellSomething
方法的std::string
返回類型,而它應該是void
!爲什麼刪除指向指針向量的指針會導致指針無效?
我正在絆倒自己,並指責可憐的無辜delete
運營商:)!
讓我們考慮一個指向一個動態分配的vector
其中包含指向動態分配的對象:
// Create the vector of pointers
std::vector<A *>* v = new std::vector<A *>;
// Create two objects
A *a1 = new A;
A *a2 = new A;
// Populate the vector
v->push_back(a1);
v->push_back(a2);
// Delete the vector
delete v;
// Try accessing one of the objects
a1->tellSomething(); --> // Segmentation fault
正如預期的那樣,如果我刪除vector
,對包含的對象的delete
不叫(我也證實A::~A()
從未在上面的代碼中被調用),但是,最後的指令給出了分段錯誤。
我從delete v
期望是兩件事情:
- ,每包含的對象調用析構函數
- 的容器被釋放
但是,在這種情況下,所包含的對象是指針,所以沒有調用析構函數。
此外,a1
不是NULL
在列表結束。
那麼,爲什麼分段錯誤?
完整示例:http://ideone.com/r8YC0。
注:我不經常使用與STL容器裸指針,請考慮下面的代碼作爲一個純粹的理論例子來幫助我理解delete v
指令的邏輯。
它是什麼'a1-> tellSomething'在做什麼? – Wug 2012-07-24 19:15:26
我相信'delete'關鍵字調用矢量的析構函數,它會依次刪除所有指針 – 2012-07-24 19:15:32
這不應該發生。你怎麼知道它不在tellSomething()方法中 - 你排除了這種可能性嗎? – mathematician1975 2012-07-24 19:16:26