我曾經聽說過,對於原語來說,當它們超出範圍時,會發生「自動」清理,但這不會發生在類或結構中。這是真的?在堆上分配時,哪些情況會發生「自動」清理(如果有的話),以及在哪些情況下不會?
例:
int * i = new int[5];
VS
Foo * foo = new foo;
我聽說過這兩種方法,我試圖確定哪個是正確的。
我曾經聽說過,對於原語來說,當它們超出範圍時,會發生「自動」清理,但這不會發生在類或結構中。這是真的?在堆上分配時,哪些情況會發生「自動」清理(如果有的話),以及在哪些情況下不會?
例:
int * i = new int[5];
VS
Foo * foo = new foo;
我聽說過這兩種方法,我試圖確定哪個是正確的。
我聽說過,對於基元「自動」清理髮生時,他們超出了範圍,但這不會發生類或結構。這是真的?
不,這是不正確的。存儲類型以及對象是否爲內置類型是C++中完全正交的概念。如果對象具有自動存儲,則在其範圍退出時發生「清除」,而不管其類型如何。
在這兩個發佈示例中,必須調用delete[]
和delete
以釋放動態分配的內存並調用需要調用的任何析構函數。
這很容易記住。每當調用new
時,必須調用delete
。因爲new int[5]
在堆上保留了5個值得記憶的整數,所以必須在某點上釋放它。
這同樣適用於new Foo
,它將堆內存中的一個Foo
歸零。 (然後調用構造等)
要使用此格式保留存儲器堆棧上:
{
int fiveInts[5];
Foo foo;
//valid here
}
//foo's destructor has been called
//and fiveInts is out of scope (but has no destructor (practically speaking))
謝謝 - 在上面顯示將在存儲器被釋放任一示例中,從而不必使用刪除關鍵字,出於任何原因? – Irongrave
@Irongrave你必須分別調用'delete []'和'delete',因爲兩者都有動態(免費存儲)分配。 – juanchopanza