簡體   English   中英

在`delete`之后重用指針

[英]Reusing a pointer after `delete`

做以下事情是否安全和/或良好做法?

//NewList is a member function of a class
void NewList(int size){

delete[] list; //list is a member variable; an already initialized dynamic array.

list=new ListObject[size];

}

我基本上放棄了以前的數組,因為我將使用不同的數據存儲在類中,因此需要一個新的list來存儲有關新數據的其他信息。 如果這不是一個好的做法,那么替代方案是什么?

這取決於。 每次使用new創建對象時,必須在使用后將其刪除。 在給定的函數中,您要刪除以創建新的函數,但是在完成對象后還要刪除嗎? 創建對象更安全,並在對象超出范圍時讓系統刪除它。

我會盡可能避免,因為如果沒有適當刪除,你可以創建內存泄漏。

是的,在刪除它指向的先前內存后,重用指針來存儲新的內存地址是完全沒問題的。

注意不要取消引用仍存儲在指針中的舊內存地址。 在你的代碼片段中,這不是問題。

作為旁注,大多數情況下,如果需要動態分配的數組,則應使用std::vector ,如注釋中所述。

你正在做的事情沒有任何內在錯誤。 但是,如果它是類的成員函數,並且list是成員變量,請注意您擁有的代碼不是異常安全的。

換句話說,如果由於某種原因調用new[]失敗,則list數組已被破壞,您無法恢復數據。

最好這樣做:

void NewList(int size)
{
    ListObject* temp = new ListObject[size]; 
    delete[] list; 
    list = temp;
}

如果對new[]的調用拋出異常,則表示您沒有銷毀原始數據。

但是,如果您使用std::vector ,所有這些都會得到解決,正如其他人所建議的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM