簡體   English   中英

C ++:關於內存管理

[英]C++ : about memory management

我對C ++有點新,到目前為止一直在用Obj-C和Java編程。

說,我有一節課:

class Person {

private:
   Wife *current_wife;
   //.....
};

所以我需要實現一個setter方法來改變Wife實例變量。

像這樣:

Person::SetCurrentWife (Wife *new_wife) {

    current_wife = new_wife;
}

這將是一個副本。

所以從主循環或我調用的東西:

Person *some_person = new Person();
...
Wife *wife = new Wife ();
some_person->SetCurrentWife(wife);

所以我很困惑:這里會有內存泄漏嗎? 我應該在這里或在Person的析構函數中刪除妻子對象嗎? 在Obj-C中,我會釋放當前的妻子,然后向上面的妻子對象發送一條保留消息,但在C ++中使用setter方法的正確方法是什么?

這取決於你想要做什么。 首先,正如Kerrek SB所評論的那樣,如果可以應用值語義,則不希望使用指針:如果Wife是可復制和可分配的,那么幾乎沒有理由動態分配它。 然而,在這種情況下,我猜測Wife派生於Person (盡管也許人的裝飾Person會更合適,因為一個給定的PersonWife可以隨着時間而改變的事實),甚至可能有來自Wife (那Person::current_wife可能想要持有其中一個),事實上, Wife有身份; 你不希望到處都是同一個妻子的副本。

如果是這種情況,那么你真的必須為其他類與Wife的交互定義一個協議。 通常情況下, Wife的生命周期不會取決於擁有它的Person (雖然如果它是一個裝飾者,它可能),所以Person應該像你一樣只握住它的指針。 最有可能的是, Wife對象將具有各種功能 - 隱式或顯式地控制其生命周期:您可能具有以下內容:

void Wife::die()
{
    //  ...
    delete this;
}

例如。 但是,在這種情況下,任何與Wife結婚的人都必須得到通知,以便當前的current_wife不指向死去的配偶。 通常,觀察者模式的一些變體可用於此。 (請注意,你在Java中有完全相同的問題;你不希望Person::current_wife指向一個死去的Wife 。所以你仍然需要一個Wife::die()函數,以及觀察者模式來通知伴侶。)

在這種情況下(根據我的經驗代表C ++中絕大多數動態分配的對象),關於C ++和Java之間的唯一區別是C ++有一個特殊的語法來調用“析構函數”; 在Java中,您使用通常的函數調用語法,並且您可以為函數提供您希望的任何名稱(雖然dispose似乎被廣泛使用)。 特殊語法允許編譯器生成額外的代碼來釋放內存,但是與對象生命周期結束相關的所有其他活動仍然需要編程(在析構函數中,在C ++中 - 盡管在這種情況下,它可能會感覺把它們中的一些直接放在Wife::die函數中)。

你應該使用智能指針。

如果你使用常規指針,請謹慎操作!

您應該在析構函數和set方法上delete舊的current_wife成員。 設置一個新的妻子將導致舊的內存泄漏,因為指向該分配的內存的指針丟失(除非您管理類外的內存 - 見下文)。

但即使這樣做,您也需要確保類外的任何人都不能刪除該成員。 您必須決定是將內存管理留給類還是分配到類的外部,並堅持使用它。

智能指針可以幫助你

using boost::shared_ptr; // or std::shared_ptr, or std::tr1::shared_ptr or something like this
class Person { 

private: 
   shared_ptr<Wife> current_wife; 
   //..... 
}; 

Person::SetCurrentWife (shared_ptr<Wife> new_wife) { 

    current_wife = new_wife; 
} 

現在你不應該刪除任何妻子。

shared_ptr<Person> some_person ( new Person );
...  
shared_ptr<Wife> wife ( new Wife );  
some_person->SetCurrentWife(wife);  

暫無
暫無

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

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