簡體   English   中英

如何刪除指向 C++ 中指針向量的指針?

[英]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.

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