回答
這取決於你如何申報您的載體。
- 如果使用RAII(你的載體是一個堆棧對象,
std::vector<...> myVec;
) - 或者,如果你創造了它在堆上(
std::vector<...>* myVec = new std::vector<...>();
)
在第一種情況下,你會不會做任何東西,因爲只要向量超出範圍(應用程序終止時總是這樣),它的desctructor就會被調用,並且它將清理它的ressoruces。
在第二種情況下,您必須調用delete myVec;
,以便1)向量變爲未初始化(與第一種情況相同,析構函數被調用等),以及2)您的向量的內存被釋放。
這就是我想感謝,我只是想檢查 – user2296321
如果你只是聲明一個向量,例如。
std::vector<int> vec;
它自動存儲時間當它超出範圍的析構函數會被調用。
如果您已使用new
,那麼您應該使用delete
。
如果你沒有用new
創建它(通常你不應該這樣做),那麼就沒有必要做任何事情。它會在其生命週期結束時自動銷燬,並且析構函數會自動釋放它的內存。
如果您是使用new
創建它的,那麼對於良好的訂單,您應該應該確保在程序結束之前將其刪除。如果你不這樣做,那麼大多數現代操作系統都會釋放內存。但允許它泄漏可能會使得難以追蹤有問題的泄漏,並可能導致異國情況的操作系統出現問題。
在任何一種情況下,都不需要清除它;析構函數會爲你做到這一點。
您的問題涉及兩個不同的事情。 OS和程序
OS部分內生命物體的:一般來說,在現代的操作系統,你不必做任何事情。任何體面的現代操作系統都會在處理結束後處理內存。即使是動態分配/請求。
這就是爲什麼Windows 95的錯誤和不穩定的原因之一。它沒有這樣做。所以如果應用程序會泄漏內存(並且應用程序一直做得很多),它會永久佔用。
C++:現在,當你有現代化的C++容器和精心設計和實現的對象時,它們都寫下了析構函數。所以他們很有禮貌,很好,他們釋放自己的記憶。它們基本上在兩個條件下被破壞。如果您不動態分配它,例如通過new
編譯器知道對象的生命何時結束。它超出了範圍。它會自動調用析構函數。如果您使用new
,則需要事先撥打delete
。
所以答案是。對象不僅可以在應用程序關閉時自行清理,而且當對象死亡時可以清理。如果你泄漏記憶,你仍然應該是安全的,然後過程結束。
當您「關閉程序」時,操作系統有責任釋放程序正在使用的任何內存。無論您如何創建矢量,當您「關閉程序」時,所有內存都將被恢復。你不必擔心任何事情。
但是,在大型程序中,您不應該依賴用戶「關閉程序」來釋放所使用的內存。如果您使用關鍵字「新」,則負責調用「刪除」。如果你聲明一個沒有「新」的向量,你不必做任何事情,因爲析構函數會自動爲你處理內存釋放。
這是更經常可以看到這樣的事情:
std::vector<MyType*> container;
而不是像這樣:
std::vector<MyType> *container = new std::vector<MyType>;
事實上,我從來沒有在我15年的編程看到的後者。在我看來,後者會打敗STL容器的目的。我想可能有人可能仍然在爲Windows 95編寫一些程序,但這似乎不太可能。任何STL容器最常見的問題是當你有一個指針的容器。由於容器不可能是異構的,所以查看或使用指向容器基類接口類的指針容器是相當常見的。在這種情況下,在從矢量中刪除東西之前,您必須循環並刪除每個對象。如果向量失去範圍,它將不知道如何刪除指向的對象。它只會清理已添加指針的內存。
如果您執行以下操作,在函數或類聲明中,則沒有內存清除義務。 STL實現可以正常工作或不工作。無論哪種方式,沒有什麼更多的程序員能做的,除了定義自己的自定義分配器:
std::vector<MyType> container; // then add some stuff to it
我不打算進入升壓或C++ 11,但FYI也有內因特殊的容器類型boost,旨在使指針容器的用戶更容易。我不確定是否有任何提供該功能的新C++ 11功能。就個人而言,我建議您不要擔心當程序泄漏內存時操作系統是否會做正確的事情。不要泄漏記憶。如果您正在使用嵌入式操作系統,請閱讀文檔並確保您知道其STL實現是否有任何限制。
- 1. 關閉c#程序
- 2. C#關閉程序
- 3. C#.Net關閉超出內存使用量的應用程序
- 4. Backgroundworker線程不關閉程序關閉?
- 5. C程序不斷關閉
- 6. 關閉Magpie緩存關閉
- 7. Windows 2000關閉程序關閉
- 8. 未關閉變量的關閉變量
- 9. 關閉iOS電源按鈕關閉應用程序關閉
- 10. C#關閉工程?
- 11. 當應用程序關閉時關閉AlertDialog內部適配器
- 12. jQuery UI對話框不關閉內部應用程序關閉
- 13. 將應用程序中的變量存儲在c中關閉#
- 14. 關閉C#表單但不關閉調用應用程序?
- 15. C#關閉最大化鍵盤關閉程序
- 16. 關閉C#ASP.Net MVC4應用程序關閉按鈕
- 17. C++ Lambda函數關閉 - 內存問題
- 18. C#StreamReader關閉 - 內存泄漏?
- 19. Javascript關閉:內存泄漏
- 20. JQuery關閉內存泄漏
- 21. AngularJS關閉內存泄漏?
- 22. 關閉和內存泄漏
- 23. C#關閉程序/線程形式
- 24. C++ Python關閉我的程序
- 25. Laravel:加入關閉內關閉。雄辯
- 26. 無法關閉以關閉變量
- 27. 變量關閉
- 28. 關閉窗體關閉SQL連接(C#)
- 29. 關閉的應用程序
- 30. 關閉/關閉WCSession
取決於你如何聲明/初始化實例和你的操作系統。 – 2013-11-27 17:00:06
用'int'或其他內置類型替換'vector'。它是一樣的,沒有區別。 – juanchopanza