簡體   English   中英

使用智能指針進行內存釋放

[英]Memory deallocation with smart pointer

在C ++中,假設Helper類中有一個方法,該方法向我返回指向另一個對象的指針。 除了方法簽名和返回對象的類型之外,我沒有關於此方法的更多信息。 在這種情況下如何進行內存管理?

我嘗試將智能指針用作以下函數:

void f() {
   auto_ptr<SomeClass> p_someClass = p_Helper->getSomeclass();
   p_someClass->doSomething();
}

一旦f()超出范圍,分配給p_someClass的內存就會被釋放。 但是,如果getSomeclass()不分配新的內存而是僅返回一個“單身”指針(而p_Helper也是單身)怎么辦? 然后,對p_Helper-> getSomeclass()的下一次調用將遇到麻煩。

解決此問題的常用方法是什么,尤其是在Helper類上的文檔很少時?

助手類的文檔怎么說? 那是最終的問題。 您必須在未指定其生存期的情況下返回指針或引用:如果它是指向類內部某些內容的指針,則可能是該類對象的生存期,但也可能具有靜態生存期(直到程序結束) —這是將字符串文字返回為char const*的函數的情況,它的生存期可能較短(例如,標准庫容器由operator[]返回的引用),或者幫助程序可能希望您刪除它。 但是,在純C ++中,后者應該很少見。 在這種情況下,慣例是返回std::auto_ptr (如果您使用的是非常現代的編譯器,則返回std::auto_ptr std::unique_ptr )。 (在C語言中,經常記錄必須通過調用返回它的庫中的特定函數來釋放返回的指針。在沒有析構函數的情況下,您必須做一些事情以最后重新獲得控制權。)

在沒有文檔的情況下,我很想說該庫不可用。 仍然……假設它指向內部某個東西並且具有該類的壽命,這可能是最合理的猜測; 這是程序員最容易忘記記錄的情況。 刪除它,或將其放在會刪除它的智能指針中,可能不是一個好主意:關於所有權問題的說法已經足夠多了,如果您應該刪除它,班級作者似乎不太可能無法記錄事實。 (但是請注意,即使您不希望刪除它,也存在生命周期問題。)

如果您不是p_Helper類的作者,請首先:

單例通常沒有公共析構函數,因此在這種情況下不會編譯。

其次,如果您“只是”獲得了沒有任何更多信息的裸露指針,就無法知道是否可以刪除它。 該信息需要在文檔中提供,以便您使用該功能/方法。

如果你正在設計 p_Helper,然后讓它返回的智能指針,而不是裸指針。 如果方法為每次調用創建一個新的資源,我建議unique_ptr ,看看這里: 的unique_ptr和shared_ptr的差異

這種情況的典型方法是使用引用計數和諸如shared_ptr類的智能指針,該指針通常會處理所有合理的情況。

在這種情況下,您可以使用原始指針。

void f() {
   SomeClass *p_someClass = p_Helper->getSomeclass();
   p_someClass->doSomething();
}

您可以進行快速測試,並比較兩次調用p_Helper-> getSomeclass()返回的指針。

bool do_not_delete =  p_Helper->getSomeclass() ==  p_Helper->getSomeclass();

如果兩個指針都相等,則很可能會獲得一個指針(該指針可能是可選的)。

hth托斯滕

暫無
暫無

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

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