2011-12-23 110 views
0

我一直在學習C++,並且遇到了一些與矢量混淆的問題。具體來說,如果一個靜態向量在內部實現了一個動態數組,那麼當程序結束時,將釋放所述動態數組使用的堆棧內存,還是應該使用刪除操作或調用靜態向量上的析構函數?是否需要刪除靜態向量?

+1

當局部變量超出作用域時,它的析構函數會自動調用。 'std :: vector'的析構函數將釋放在其存在期間由本地'std :: vector'對象內部分配的任何動態內存。全局對象的析構函數在程序退出之前同樣被調用。 – lapk 2011-12-23 06:26:06

+2

提供「靜態矢量」的代碼示例。靜態在C++中意味着很多東西。 # – 2011-12-23 06:33:12

回答

-1

所有內存都在程序結束時釋放。

1

一個向量有它自己的內部內存管理。這意味着它在創建時(在其構造函數中)分配它認爲需要的內容,以及在需要時它將需要的任何額外內存。

當矢量被破壞(或者超出範圍或程序終止,或者被手動刪除)時,它在內部分配的所有內存都隨之被刪除。

0

該向量的析構函數將在程序終止前調用。

如果矢量持有指向對象的指針,它們的析構函數將不會被調用,儘管在大多數平臺上,程序終止時釋放了由進程分配的所有內存。

3

我應該使用刪除操作

如果沒有使用new,然後從未呼叫delete它分配有問題的事情。

或者在靜態向量上調用析構函數?

如果您沒有使用展示位置定位new,然後從未調用析構函數明確地重新初始化就地的東西。

(如果你不是誰正在實施的std ::向量標準庫的人,那麼你幾乎肯定會永遠不需要使用展示位置定位new自己,永遠。)

全局變量得到清理自動在節目結束。

0

我不確定靜態矢量是什麼意思。 std :: vector是一個管理可調整大小數組的STL容器(請參閱:http://www.cplusplus.com/reference/stl/vector/)。全局上下文中的靜態意味着本地文件,以便該符號在包含的編譯單元之外不可見。在類上下文中的靜態主要是一種命名空間技巧,用於創建與類類型(與類實例相對)關聯的全局變量。

std :: vector是否是靜態的,與它的實現方式無關。所有std :: vector實例分配並維護動態分配的T的連續數組。矢量的析構函數將刪除它先前分配的T的數組。你不需要分配或釋放這些內存,甚至不需要知道它正在發生。如果你的std :: vector實例是靜態的,它的析構函數將在main()退出後被調用。如果它被分配到棧上,它的析構函數會在超出範圍時被調用。如果你打電話

std::vector<T>* p = new std::vector<T>(); 

你將負責調用

delete p; 

p超出範圍了。最後,如果你的向量本身包含動態分配的指針,你也將負責刪除這些指針。

// Not exception safe code! 
std::vector<int*> v; 
v.push_back(new int(4)); 
v.push_back(new int(5)); 
std::cout << *v[0] << ", " << *v[1] << std::endl; 
for (auto iter = v.begin(); iter != v.end(); ++iter) { 
    delete *iter; 
} 
v.clear(); 

拇指在C/C一個很好的規則++是:

那你新的,你也刪除。

既然你沒有新的矢量使用的數組,你不需要刪除它。

+0

''''''''''''''''''''''''''''''''''''''建議增加:爲了讓該死的東西異常安全...;) – 2011-12-23 13:19:58

+0

hehe ..我應該注意到我的示例代碼存儲動態分配的指針一個好的設計,只是說明如果你存儲new'd內存,矢量類將不會在你調用v.clear()時爲你調用delete。 – 2011-12-23 18:57:49