2013-10-25 39 views
-1

我有一個問題,我敢肯定,我知道它的原因。我只是想澄清一下。我有一個包含其他類的類,但爲了簡單起見,我將示例限制爲兩個類。C++需要澄清關於析構函數和範圍

A類包含B類。在A類的構造函數中,它通過調用B的構造函數來初始化B類。在A類構造函數的最後,B類的析構函數被調用,這不是我期待的行爲。下面是一個例子...

#include "b.h" 

class a { 
    public: 
     b classB; 

     a(int someParam); 
}; 

a.cpp

#include "a.h" 

//Class A's constructor 
a::a(int someParam) { 
    //Set class B by calling it's constructor 
    classB = b(someParam); 
    //Now class B's destructor gets called when exiting A's constructor... 
} 

我知道,如果你聲明的變量,而不使用「新」,它就會當它離開當前銷燬範圍。但我一直認爲它應用於變量的作用域,而不是你爲其賦值的範圍。那的問題吧?如果是這樣,那麼做classB = *new b(someParam);是沒有問題的?或者我應該只使用指針?

+0

閱讀一本好的C++編程書。 'classB = * new b(someParam);''*複製'new b'創建的對象(所以你有內存泄漏)。 –

+0

@BasileStarynkevitch好吧,這很好。謝謝 –

回答

3

在這一行:

classB = b(someParam); 

表達b(someParam)創建臨時,無名b對象,然後將其asssigned到成員對象,classB。它是被稱爲這個無名暫時的析構函數,而不是你的成員對象的析構函數。如果你想避免這個臨時的創造,而不是直接與適當的構造函數初始化成員對象,使用初始化列表:

a::a(int someParam) 
    :classB(someParam) 
{} 

而且這樣的:

classB = *new b(someParam); 

是一個即時的內存泄漏。您正在免費商店分配一個對象,將其分配給classB,並丟失指針。

+0

OP詢問'classB = * new b(someParam);'...... –

+0

@BasileStarynkevitch:這是一個基於OP關於什麼問題的假設的從屬條款。 OP對這個問題的假設是錯誤的。但我會添加一個註釋。 –

+0

好的,現在有道理。我正要切換到使用指針,因爲我不知道初始化列表。謝謝。 –