在析構函數中將指標設定為NULL
在物件導向程式設計中,動態分配記憶體並使用析構函式釋放記憶體是很常見的。考慮以下為 Bar 類型的物件分配記憶體的類別:
<code class="cpp">class Foo { public: Foo() : bar(new Bar) { } ~Foo() { delete bar; } void doSomething() { bar->doSomething(); } private: Bar* bar; };</code>
問題出現了:在析構函數中將 bar 指標設為 NULL 有好處嗎?
反對設定為 NULL 的爭論
與流行的看法相反,不建議在析構函數中將指標設為 NULL。雖然出於調試目的這似乎是個好主意,但它可能會導致發布版本中隱藏的問題。
如果指標設為 NULL,則某個地方可能存在對已刪除物件的懸空參考。在調試版本中,將檢測到此引用並觸發可診斷的崩潰。然而,在發布版本中,有缺陷的程式碼可能會避免使用指針,因為它注意到它是 NULL,從而掩蓋了潛在的問題。
替代方法
而不是將指標設為 NULL,更好的做法是將其設為已知的錯誤指標值。這樣,對已刪除物件的任何懸空引用仍將嘗試使用指針,從而觸發更容易診斷和修復的崩潰。
例如,可以使用以下習慣用法:
<code class="cpp">~Foo() { delete bar; if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF); }</code>
這種方法允許在調試版本中捕獲潛在的錯誤,同時仍然確保發布版本檢測到懸空引用並導致崩潰。
結論
雖然它在析構函數中將指標設為 NULL 似乎是個好主意,這樣做可以隱藏發布版本中的潛在問題。相反,建議在調試模式下設定指向已知錯誤值的指針,以方便診斷和調試。
以上是析構函數中的指標應該設定為 NULL 嗎?看看最佳實踐和調試。的詳細內容。更多資訊請關注PHP中文網其他相關文章!