天天看點

C++中一個delete的問題

// String 的析構函數
String::~String(void)
{
   delete [] m_data;
   // 由于m_data 是内部資料類型,也可以寫成 delete m_data;
}
           

Q:上面的注釋不太明白,為什麼内部資料類型delete的時候就可以不加[]?

A1:你能深入思考這個問題,不簡單啊。我的了解是這樣的:

因為是内部資料的時候,編譯器是可以識别的,即便是比如數組,編譯器可以識别它是數組,如:char s[];當delete s;時,編譯器讀入s的位址,就可以判斷它是數組類型---就像出入數組參數隻需要傳入數組名即可。數組名代表數組的開頭位址,即數組的入口。數組是在記憶體表示上是一段連續記憶體,是以可以連續删除。當然用 delete[] s;更好,這樣顯式聲明其為數組了。另一個原因是,對于内置資料類型delete的操作是已經定義好了,程式員不能再重新定義它了。而對于程式員自己定義的class來說,程式員可以自己去定義其行為。

但是,如果是其他類型,如:class C; C s1[];當delete s1;時,因為C不是内置資料類型,是程式員自己定義的類,是以,允許程式員自己定義delete操作。程式員類的delete重載操作符的是删除部分或全部。是以編譯器就預設當是delete 一個類對象時,隻析構第一個。如果要析構所有,必須添加[],即delete[]。

建議:對于數組來說,無論是内置類型或者是使用者自定義類型,顯示使用deletep[]可以增加程式的可讀性。

A2:因為内置的類型不需要調用析構函數, 而如果是複雜的,需要調用析構函數的類型,如果是數組用 delete m_data這類的用法,就會造成後面的元素的析構函數沒被調用

無論如何應該厘清楚 delete[] 和delete, 混淆這個有可能造成隐含的問題或者造成誤解,卻得不到任何好處, 是以寫這注釋的人就是胡扯。

A3:我的觀點是,不管的build-in type, 還是ADT,隻要是數組,統一用delete[]。

LINK:原文連結

ps.C++中的delete在C中怎麼表示原文連結

for(i=0;i<n;i++) 
 {
     delete []M[i];
  }
  delete []M;
           

這段代碼 用C表示:

for(i=0;i<n;i++) 
 {
     free(M[i]);
  }
  free(M);
           

繼續閱讀