2013-11-27 44 views
0

我剛剛在使用C++編程時使用向量的問題。如果您創建了一個矢量,您是否需要在程序關閉之前將其清除或刪除,或者在關閉程序時將矢量刪除並釋放內存?關閉程序的向量內存關閉C++

感謝

史蒂芬

+1

取決於你如何聲明/初始化實例和你的操作系統。 – 2013-11-27 17:00:06

+0

用'int'或其他內置類型替換'vector'。它是一樣的,沒有區別。 – juanchopanza

回答

0

這取決於你如何申報您的載體。

  1. 如果使用RAII(你的載體是一個堆棧對象,std::vector<...> myVec;
  2. 或者,如果你創造了它在堆上(std::vector<...>* myVec = new std::vector<...>();

在第一種情況下,你會不會做任何東西,因爲只要向量超出範圍(應用程序終止時總是這樣),它的desctructor就會被調用,並且它將清理它的ressoruces。

在第二種情況下,您必須調用delete myVec;,以便1)向量變爲未初始化(與第一種情況相同,析構函數被調用等),以及2)您的向量的內存被釋放。

+0

這就是我想感謝,我只是想檢查 – user2296321

0

如果你只是聲明一個向量,例如。

std::vector<int> vec; 

自動存儲時間當它超出範圍的析構函數會被調用。

如果您已使用new,那麼您應該使用delete

0

如果你沒有用new創建它(通常你不應該這樣做),那麼就沒有必要做任何事情。它會在其生命週期結束時自動銷燬,並且析構函數會自動釋放它的內存。

如果您是使用new創建它的,那麼對於良好的訂單,您應該應該確保在程序結束之前將其刪除。如果你不這樣做,那麼大多數現代操作系統都會釋放內存。但允許它泄漏可能會使得難以追蹤有問題的泄漏,並可能導致異國情況的操作系統出現問題。

在任何一種情況下,都不需要清除它;析構函數會爲你做到這一點。

0

您的問題涉及兩個不同的事情。 OS和程序

OS部分生命物體的:一般來說,在現代的操作系統,你不必做任何事情。任何體面的現代操作系統都會在處理結束後處理內存。即使是動態分配/請求。

這就是爲什麼Windows 95的錯誤和不穩定的原因之一。它沒有這樣做。所以如果應用程序會泄漏內存(並且應用程序一直做得很多),它會永久佔用。

C++:現在,當你有現代化的C++容器和精心設計和實現的對象時,它們都寫下了析構函數。所以他們很有禮貌,很好,他們釋放自己的記憶。它們基本上在兩個條件下被破壞。如果您不動態分配它,例如通過new編譯器知道對象的生命何時結束。它超出了範圍。它會自動調用析構函數。如果您使用new,則需要事先撥打delete

所以答案是。對象不僅可以在應用程序關閉時自行清理,而且當對象死亡時可以清理。如果你泄漏記憶,你仍然應該是安全的,然後過程結束。

0

當您「關閉程序」時,操作系統有責任釋放程序正在使用的任何內存。無論您如何創建矢量,當您「關閉程序」時,所有內存都將被恢復。你不必擔心任何事情。

但是,在大型程序中,您不應該依賴用戶「關閉程序」來釋放所使用的內存。如果您使用關鍵字「新」,則負責調用「刪除」。如果你聲明一個沒有「新」的向量,你不必做任何事情,因爲析構函數會自動爲你處理內存釋放。

0

這是更經常可以看到這樣的事情:

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實現是否有任何限制。