我一直在學習C++,並且遇到了一些與矢量混淆的問題。具體來說,如果一個靜態向量在內部實現了一個動態數組,那麼當程序結束時,將釋放所述動態數組使用的堆棧內存,還是應該使用刪除操作或調用靜態向量上的析構函數?是否需要刪除靜態向量?
回答
所有內存都在程序結束時釋放。
一個向量有它自己的內部內存管理。這意味着它在創建時(在其構造函數中)分配它認爲需要的內容,以及在需要時它將需要的任何額外內存。
當矢量被破壞(或者超出範圍或程序終止,或者被手動刪除)時,它在內部分配的所有內存都隨之被刪除。
該向量的析構函數將在程序終止前調用。
如果矢量持有指向對象的指針,它們的析構函數將不會被調用,儘管在大多數平臺上,程序終止時釋放了由進程分配的所有內存。
我應該使用刪除操作
如果沒有使用new
,然後從未呼叫delete
它分配有問題的事情。
或者在靜態向量上調用析構函數?
如果您沒有使用展示位置定位new
,然後從未調用析構函數明確地重新初始化就地的東西。
(如果你不是誰正在實施的std ::向量標準庫的人,那麼你幾乎肯定會永遠不需要使用展示位置定位new
自己,永遠。)
全局變量得到清理自動在節目結束。
我不確定靜態矢量是什麼意思。 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一個很好的規則++是:
那你新的,你也刪除。
既然你沒有新的矢量使用的數組,你不需要刪除它。
''''''''''''''''''''''''''''''''''''''建議增加:爲了讓該死的東西異常安全...;) – 2011-12-23 13:19:58
hehe ..我應該注意到我的示例代碼存儲動態分配的指針一個好的設計,只是說明如果你存儲new'd內存,矢量類將不會在你調用v.clear()時爲你調用delete。 – 2011-12-23 18:57:49
當局部變量超出作用域時,它的析構函數會自動調用。 'std :: vector'的析構函數將釋放在其存在期間由本地'std :: vector'對象內部分配的任何動態內存。全局對象的析構函數在程序退出之前同樣被調用。 – lapk 2011-12-23 06:26:06
提供「靜態矢量」的代碼示例。靜態在C++中意味着很多東西。 # – 2011-12-23 06:33:12