#define SAFE_DELETE(p) {if(NULL != p) {delete p; p = NULL;}}
如果在刪除p後需要p = null?爲什麼在C++中釋放對象的指針類型時需要p = NULL?
如果需要,爲什麼需要它?
#define SAFE_DELETE(p) {if(NULL != p) {delete p; p = NULL;}}
如果在刪除p後需要p = null?爲什麼在C++中釋放對象的指針類型時需要p = NULL?
如果需要,爲什麼需要它?
雙刪除/免費是不允許的,以下代碼導致運行時間期間一個 「雙無差錯」:
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 /刪除是確保你沒有自由/在一段時間以後將其刪除。
這不是需要。這只是增加的安全性。刪除內容會導致數據無效。如果您在刪除p
後嘗試解除引用,那麼您將面臨未定義的行爲。通過將其設置爲NULL
,您清楚地表明該指針不再有效(並且可以使用類似if (p != NULL) {...}
的方式輕鬆檢查,但無法檢查數據是否已被釋放)。
大概是這樣,第二次嘗試不會嘗試第二次刪除它....! – 2013-05-09 01:24:27
只有錯誤的代碼需要在刪除它之後將指針設置爲NULL。 – Praetorian 2013-05-09 01:28:22
@Praetorian:這就是爲什麼叫做SAFE_DELETE! :) – 2013-05-09 01:33:28