例如,
class Test{
private:
int* foo;
public:
Test(int* foo){this->foo = foo;}
}
在這種情況下,有什么方法可以洗掉解構式中的 foo 嗎?我是否必須在解構式中洗掉 foo 或至少將其設定為 nullptr?
uj5u.com熱心網友回復:
當然,你可以。這是合法的語法。并且根據程式的其余部分,它可能會執行您想要的操作,或者它可能是雙重洗掉(兩次洗掉相同的指標),這會破壞堆并導致最終崩潰。(除錯編譯器可能會發現這一點。)
其中一個標準模板庫給我們的原因shared_ptr,并unique_ptr用手記憶體管理是很難。這不是不可能的;人們做了(或嘗試)了很多很多年。但它也是許多運行時災難的根源,要么是雙重洗掉(也稱為舊的 malloc/free 例程中的過早釋放),要么是相反的記憶體泄漏。自動記憶體管理是 Java 作為 C/C 類似語言的賣點之一,沒有記憶體錯誤風險。后來 C# 向用戶提出了同樣的建議。
我建議使用 STL 并考慮 foo 的所有權語意。也許 Test 類應該擁有它;也許它應該分享它;也許它真的應該有一個弱參考。無法從程式片段中分辨出來。我只能說你應該回顧一下 C 中記憶體管理的現代思想并采用它們。
uj5u.com熱心網友回復:
洗掉這個指標在語意上是合法的,但我想這不是你問的原因。你問這是否是個好主意。
在 C 中處理原始指標通常是一種不好的做法,這個問題就是原因之一。為了讓任何閱讀它的人都能明顯地使用該類,std::unique_ptr如果您打算獲得指標和參考的所有權,或者std::shared_ptr如果您不打算,我會使用它。
智能指標物件將跟蹤您是否已洗掉指標,并且它們將在其解構式中自動洗掉指標。
如果您絕對必須有一個原始指標并且您需要檢查它是否被洗掉,恐怕您唯一的選擇是nullptr在洗掉后立即分配給它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372821.html
