2013-05-09 47 views
-4
#define SAFE_DELETE(p)    {if(NULL != p) {delete p; p = NULL;}} 

如果在刪除p後需要p = null?爲什麼在C++中釋放對象的指針類型時需要p = NULL?

如果需要,爲什麼需要它?

+1

大概是這樣,第二次嘗試不會嘗試第二次刪除它....! – 2013-05-09 01:24:27

+1

只有錯誤的代碼需要在刪除它之後將指針設置爲NULL。 – Praetorian 2013-05-09 01:28:22

+0

@Praetorian:這就是爲什麼叫做SAFE_DELETE! :) – 2013-05-09 01:33:28

回答

1

雙刪除/免費是不允許的,以下代碼導致運行時間期間一個 「雙無差錯」:

  • delete p; delete p;
  • free(p); free(p);

但刪除/釋放空點行:

  • delete NULL; //什麼都不做
  • free(NULL); //什麼都不做

你不必檢查指針爲空或不刪除/釋放之前,C/C++標準允許NULL被傳遞到刪除/免費。因此在釋放/刪除之前,檢查指針是否爲空或不是「必須」。 這一點,你SAFE_DELETE(P)可以安全地被簡化爲

#define SAFE_DELETE(p) do { delete p; p = NULL; } while (0); 

免費後設置指針爲NULL /刪除是確保你沒有自由/在一段時間以後將其刪除。

3

這不是需要。這只是增加的安全性。刪除內容會導致數據無效。如果您在刪除p後嘗試解除引用,那麼您將面臨未定義的行爲。通過將其設置爲NULL,您清楚地表明該指針不再有效(並且可以使用類似if (p != NULL) {...}的方式輕鬆檢查,但無法檢查數據是否已被釋放)。

相關問題