[英]How do you delete a pointer to a vector of pointers in c++?
讓我們說在 AI 類中有一個指向向量的指針,該向量充滿指向 B 類的指針
Class A {
....
std::vector<B *>* table;
....
}
Class B {
int var1;
int var2;
B (const int _var1, const int _var2){
var1 = _var1;
var2 = _var2;
}
}
如何在其析構函數中刪除 A 類中的表?
我試過
~A()
{
for (int i = 0; i < table->size(); i++)
{
delete (*table)[i];
}
delete[] table;
}
但由於某種原因,它在析構函數處給出了段錯誤。
謝謝你的幫助!
您的段錯誤是由這一行引起的:
delete[] table;
它告訴編譯器您希望刪除一個數組。 table
不是數組,盡管它可能表現得像它,但它是指向堆上單個對象的指針並調用delete[]
(而不是delete
),因此會導致未定義的行為。
根據經驗,永遠不要使用裸指針。 如果您確實使用裸指針,請始終使用與new
相同的形式進行delete
。
正如評論中指出的那樣,在現代 C++ 中,你永遠不應該有一個裝滿裸指針的容器(裸指針是指不由使用 RAII 的包裝對象管理的指針)。
因此,您應該使用std::unique_ptr<B>
或std::shared_ptr<B>
的東西代替向量中的B*
。 您也不應該有std::vector
指針,而應該將std::vector
復制或移動(如果復制成本很高)到位。 使用智能指針而不是裸指針,這希望不會再發生:p。
由於析構函數中的delete[] table
語句,您會收到分段錯誤。
替換delete[] table;
只需delete table;
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.