對不起,關於標題。我不知道該說什麼。如果有任何MODS正在閱讀並且他們理解這個問題,那麼請根據需要重新命名。在主新變量內刪除新變量
假設您創建了一個new
變量(varOne)。
在varOne代碼中,其他變量創建爲new
(varTwo,varThree)。
如果你在varOne上調用delete,varTwo和varThree會被刪除,還是需要刪除它們並刪除varOne?
對不起,關於標題。我不知道該說什麼。如果有任何MODS正在閱讀並且他們理解這個問題,那麼請根據需要重新命名。在主新變量內刪除新變量
假設您創建了一個new
變量(varOne)。
在varOne代碼中,其他變量創建爲new
(varTwo,varThree)。
如果你在varOne上調用delete,varTwo和varThree會被刪除,還是需要刪除它們並刪除varOne?
您只需要刪除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或你的程序將受到影響內存問題。 (換句話說,如果您在構造函數中進行內存分配,請確保您覆蓋或刪除默認的複製構造函數和賦值運算符)。
你必須刪除它們並單獨刪除varOne
,但實際上varOne
的構造函數應該分配這些變量,並且析構函數應該釋放它們,如果它們由於某種原因必須位於堆上。最好將它們按價值存儲起來,並將其清除爲new
和delete
。
我不是100%確定你的意思,但總的來說,任何你分配新的東西,你必須單獨釋放刪除。
如果您是指在C++類的上下文中,您需要手動刪除析構函數的varOne和varTwo。
使用智能指針,並永遠不會有delete
任何東西在您自己的代碼中。
我不知道如何理解你的問題,因爲你不需要一個變量(所有變量都是靜態的,自動的或成員變量)但是對象(你從new
獲得的指針通常會被分配使用初始化變量,也許這就是你的意思?)。因此,我會給出一個普遍的答案,並希望您所要求的內容包含在內。
首先,作爲基本規則,您分配的每個對象new
必須用delete
明確釋放。但是,delete
可能隱藏在另一個對象中,例如來自boost或C++ 11的shared_ptr
和scoped_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++的構造函數的異常處理規則會自動處理這個問題。