c++ dynamic - 刪除空指針是否安全?




memory allocation (7)

刪除空指針是否安全?

這是一種很好的編碼風格嗎?


Answers

除非您重載刪除操作符,否則它是安全的。 如果你重載了刪除操作符並且不處理null條件,那麼它根本就不安全。


刪除空指針不起作用。 這不是一種好的編碼風格,因為它不是必需的,但它也不錯。

如果您正在尋找良好的編碼習慣,請考慮使用智能指針,因此您根本不需要delete


為了補充ruslik的答案,在C ++ 14中,你可以使用這個構造:

delete std::exchange(heapObject, nullptr);

是的,它是安全的。

刪除空指針並沒有什麼壞處; 如果未分配的指針被初始化為零然後簡單地刪除,它通常會減少函數尾部的測試次數。

由於前面的句子引起了混淆,因此一個例子 - 這並不是特例安全 - 正在描述的內容:

void somefunc(void)
{
    SomeType *pst = 0;
    AnotherType *pat = 0;

    …
    pst = new SomeType;
    …
    if (…)
    {
        pat = new AnotherType[10];
        …
    }
    if (…)
    {
        …code using pat sometimes…
    }

    delete[] pat;
    delete pst;
}

樣本代碼中有各種各樣的小瑕疵,但這個概念(我希望)很清楚。 指針變量初始化為零,以便函數末尾的delete操作不需要測試它們在源代碼中是否為非空; 無論如何,庫代碼都會執行該檢查。


我經歷過,它是不安全的(VS2010)刪除[] NULL(即數組語法)。 我不確定這是否符合C ++標準。

刪除NULL(標量語法) 安全的。


來自C ++ 0x標準草案。

$ 5.3.5 / 2 - “[...]或者,delete的操作數的值可能是一個空指針值。[...'”

當然,沒有人會'刪除'具有NULL值的指針,但是這樣做是安全的。 理想情況下,不應該有刪除空指針的代碼。 但是,在循環中刪除指針(例如在容器中)時,它有時很有用。 由於NULL指針值的刪除是安全的,因此可以真正寫入刪除邏輯,而不用顯式檢查要刪除的NULL操作數。

另外,C標準$ 7.20.3.2也表示'空'指針沒有任何動作。

釋放函數使ptr指向的空間被釋放,也就是說,可用於進一步分配。 如果ptr是空指針,則不會發生任何操作。


對於指針,你需要它們指向某些東西,所以指針會佔用內存空間。

例如,一個採用整型指針的函數不會接受整型變量。 所以你需要為這個函數首先創建一個指針。

至於參考,它不會花費內存。 你有一個整型變量,你可以將它作為參考變量傳遞。 而已。 您無需專門為其創建參考變量。





c++ pointers memory-management null-pointer delete-operator