2011-10-07 90 views
1

我對C++中的內存管理是如何工作有些困惑,我理解你什麼時候使用指針(新/刪除),但是在幀分配時我會丟失。C++內存管理與堆分配和幀分配的區別

說我有一個簡單的類(使用Qt類)

​​

我使用指針

Demo *testInst = new Demo(); 

現在我明白了,當我打電話給它分配 「刪除testInst;」這是釋放,但我對框架分配超出範圍部分感到困惑。這是否意味着當我調用delete時,類中所有不是指針的類都會自動釋放,還是必須在Demo類的解構器中進行特定的內存管理?或者這意味着如果我離開這些類,那些變量就被釋放了?

我是C++的新手,來自.NET背景,因此我不是100%理解手動內存管理。

+1

您在哪裏找到「幀分配」這個術語?除了上面的正常堆以外沒有其他任何標誌。 – bmargulies

+0

我認爲它的一個術語更多地用在MFC中,所以對不起,如果我沒有得到正確的定義,我在Qt中做事情,所以我只是想知道非指針對象(QString)在指針對象(QString) *)我是否需要手動執行任何操作來釋放它們,或者是否刪除指針對象刪除沒有使用新指針分配的對象? – DrHouse

回答

1

在C++中有兩種分配規則。堆和堆棧。當你寫'框架'時,我懷疑你的意思是堆棧。有時候,特別是在舊的C源中,它被稱爲「自動」。

Demo localDemo; 

是如何使用堆棧。在此之後執行下一條語句之前,C++承諾創建一個Demo類型的臨時對象並調用no-args構造函數。在當前{}引用localDemo的詞彙塊的最後一條語句之後,C++承諾調用析構函數並釋放存儲。存儲實際上是過程或塊的堆棧框架的一部分。

相關問題是類類型的數據成員。如果你寫:

class Proletariat { 
    private: 
     Demo localDemo; 
}; 

那麼對於Proletariat自動生成的構造函數將調用Demo構造函數和析構函數總是會調用析構函數Demo

如果你有ARGS一個構造函數,你寫的東西,如:

class Proletariat { 
    private: 
     Demo localDemo; 
    public: 
     Proletariat() : localDemo("omeD") {} 
} 

通過這些ARGS。

}; 
+0

因此,如果它包含在一個類中,那麼這個對象是否會終結類的生命(如果作爲私有變量完成),直到我使用delete調用該對象的析構函數? – DrHouse

+0

這完全是另一回事。編輯即將到來 – bmargulies

+0

謝謝,這幫助我理解C++ Mem管理。 – DrHouse

0

在普通的C++,你通常會需要爲每一個newdelete(過於簡單化,我知道)這是在你的代碼。

在上面的示例中,除了調用delete之外,您不需要執行進一步的內存管理,如前所述。如果您的類具有在堆上分配的成員變量(例如,aString是在構造函數中有new'd的QString *,那麼在您的析構函數中,您還需要將其刪除)