2012-01-28 62 views
0

對不起,關於標題。我不知道該說什麼。如果有任何MODS正在閱讀並且他們理解這個問題,那麼請根據需要重新命名。在主新變量內刪除新變量

假設您創建了一個new變量(varOne)。

在varOne代碼中,其他變量創建爲new(varTwo,varThree)。

如果你在varOne上調用delete,varTwo和varThree會被刪除,還是需要刪除它們並刪除varOne?

回答

2

您只需要刪除varTwo和varThree,因爲當您脫離varOne的析構函數時,用於調用varOne的析構函數的刪除將清除該varOne的實例。

換句話說,在下面的例子中,的Varone是富,varTwo是M_I和varThre是M_C:

class Foo 
{ 
public: 
    Foo() : m_i(new int), m_c(new char) { } 
    ~Foo() { delete m_i; delete m_c; } 
    // don't forget to take care of copy constructor and assignment operator here!!! 
private: 
    int* m_i; 
    char* m_char; 
}; 

main() 
{ 
    Foo* p = new Foo; 
    delete p; 
} 

還要確保當你這樣做,你跟着The Rule of Three或你的程序將受到影響內存問題。 (換句話說,如果您在構造函數中進行內存分配,請確保您覆蓋或刪除默認的複製構造函數和賦值運算符)

1

你必須刪除它們並單獨刪除varOne,但實際上varOne的構造函數應該分配這些變量,並且析構函數應該釋放它們,如果它們由於某種原因必須位於堆上。最好將它們按價值存儲起來,並將其清除爲newdelete

1

我不是100%確定你的意思,但總的來說,任何你分配新的東西,你必須單獨釋放刪除。

如果您是指在C++類的上下文中,您需要手動刪除析構函數的varOne和varTwo。

1

使用智能指針,並永遠不會有delete任何東西在您自己的代碼中。

0

我不知道如何理解你的問題,因爲你不需要一個變量(所有變量都是靜態的,自動的或成員變量)但是對象(你從new獲得的指針通常會被分配使用初始化變量,也許這就是你的意思?)。因此,我會給出一個普遍的答案,並希望您所要求的內容包含在內。

首先,作爲基本規則,您分配的每個對象new必須用delete明確釋放。但是,delete可能隱藏在另一個對象中,例如來自boost或C++ 11的shared_ptrscoped_ptr//unique_ptr或C++的更新版本中的auto_ptr

如果你的對象包含子對象,通常最好是讓它們成爲直接成員,所以你根本不用new來分配它們(事實上,這在C++中是一個通用規則:如果你不一定要動態分配, 別)。也就是說,你寫你的類作爲

class X 
{ 
public: 
    // ... 
private: 
    Type1 subobject1; 
    Type2 subobject2: 
}; 

,並在所有沒有惹new/delete的子對象。但是,如果您需要動態分配對象,則還必須刪除它們,例如

class X 
{ 
public: 
    X() 
    { 
    subobject1 = new Type1(); 
    try 
    { 
     subobject2 = new Type2(); 
    } 
    catch(...) 
    { 
     delete subobject1; 
    } 
    } 
    ~X() 
    { 
    delete subobject2; 
    delete subobject1; 
    } 
    // ... 
private: 
    X(X const&); // disabled 
    X& operator=(X const&); // disabled 
    Type1* subobject1; 
    Type2* subobject2; 
}; 

注意的相當複雜的代碼X的構造,以確保對象正確清理,即使在異常情況下。還要注意,你還必須實現拷貝構造和賦值,或者通過使它們變爲私有和未實現來禁用它們(請注意,C++ 11提供了特殊的語法= delete來禁用它們)。您可以通過使用智能指針自己節省了不少的麻煩(但你還是要關心副本的建設和分配,至少有通常的智能指針):

class X 
{ 
public: 
    X(): 
    subobject1(new Type1()), 
    subobject2(new Type2()) 
    { 
    } 
private: 
    X(X const&) = delete; // disabled 
    X& operator=(X const&) = delete; // disabled 
    std::unique_ptr<Type1> subobject1; 
    std::unique_ptr<Type2> subobject2; 
}; 

在這裏,我用C++ 11的unique_ptr(因此也使用C++ 11語法來刪除拷貝構造函數和賦值運算符)。請注意,在第一次印象中,此代碼似乎根本沒有delete;然而那些delete實際上隱藏在unique_ptr的析構函數中。另外請注意,現在不再需要構造函數中的顯式異常處理;由於刪除是在unique_ptr的析構函數中完成的,C++的構造函數的異常處理規則會自動處理這個問題。