簡體   English   中英

在C ++中刪除指針數組時析構函數崩潰

[英]Destructor crashing when deleting an array of pointers in C++

我做了一個叫做cell的課。 在此類內部,有一個cell指針數組。 標頭看起來像這樣:

class cell
{       
 public:
  cell();
  cell *c[8];
  void creatcells();
  virtual ~cell();
  ..

}

cpp文件如下所示:

cell::cell()
{
//ctor
 for(int i=0;i<8;i++)
 {
   c[i]=NULL;
 }

}


void cell::creatcells()

 {
   cell c1,c2,c3,c4,c5,c6,c7,c8;

   c[0]=&c1;
   c[1]=&c2;
   c[2]=&c3;
   c[3]=&c4;
   c[4]=&c5;
   c[5]=&c6;
   c[6]=&c7;
   c[7]=&c8;
 }

cell::~cell()
{
    for(int i=0; i<8; i++)
    {
        if (c[i]!=NULL)
        {
                    delete c[i];
        }
    }
    delete[] c;

 }

但是,每次程序結束時,它都會崩潰,為什么呢?
我嘗試不使用if (c[i]!=NULL) ,但這沒有幫助。 只有沒有for循環,代碼才能完美結束,但是我知道也必須刪除它。 我認為我正確地編寫了析構函數,不是嗎?

void cell::creatcells()
 {
   cell c1,c2,c3,c4,c5,c6,c7,c8;

   c[0]=&c1;
   c[1]=&c2;
   ...

上述所有cell對象都會在createcells()的末尾自動銷毀。 createcells() delete c[i]; createcells() 在析構函數中是UB。您想要的是

 c[0]= new cell();
 c[1]= new cell();

您正試圖取消對具有自動存儲持續時間並且不再屬於范圍的變量的指針的引用並delete它們! 您的編譯器沒有警告您嗎?

因此,程序的行為是不確定的

永遠只能配對delete[]new[]delete一個new ; 盡管您可以將delete (甚至是new 1 )委托給托管指針類,例如std::unique_ptr

為什么不重構為std::vector<cell>並利用返回值優化


1使用std::make_unique

cell::createcells函數中,變量是局部變量,超出范圍,一旦函數返回,它們將被銷毀。 當您嘗試刪除這些對象時,這些對象將不存在。 取消引用那些指針將導致未定義的行為

更不用說您應該只delete new 而且,由於你沒有new東西做delete的指針再次導致不確定的行為

簡單的解決方案是使用對象 向量

std::vector<cell> c;

然后只需將八個cell對象添加到向量中:

void cell::creatcells()
{
    c = std::vector<cell>(8);
}

現在,向量將包含八個默認構造的cell對象。 無需在構造函數或析構函數中進行任何操作。 實際上,我建議您完全按照零規則刪除構造函數和析構函數。

暫無
暫無

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

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