2013-01-17 127 views
0

我創建一個int在堆上這樣的載體:載體和釋放內存

std::vector<int> vec = *new std::vector<int>();

然後我得到我的節目的最後,我需要釋放內存,但使用vec.clear()不會釋放內存。

我該如何正確做到這一點?

感謝所有最好的 -Mitchell

+2

'* new'嗯,你爲什麼這樣做? – GManNickG

+0

對於每一個新的你想刪除,所以刪除vec。 –

+0

@brianbeuning:'vec'不是一個指針,也不是'new''。 – GManNickG

回答

4

我該怎麼做這個正常嗎?

替換此:

std::vector<int> vec = *new std::vector<int>(); 

有了這個:

std::vector<int> vec; 

問題解決了。

與其他可能遇到的語言不同,在大多數情況下最好避免使用new。它動態分配對象,就像其他語言一樣。但與其他語言不同,C++沒有垃圾收集器,因此您需要手動銷燬您動態分配的對象。但是,您編寫代碼的方式已經使您無法做到這一點。

你動態地分配一個新的對象,它返回一個指向對象的指針。然後,您將取消引用該指針(通過*),並將該對象複製到vecvec被正確銷燬,但從中複製的動態分配的對象不會。由於您沒有存儲該指針,因此無法訪問該對象,無法處理該對象。爲了摧毀目標,你將不得不捕獲指針,就像這樣:

std::vector<int>* vec_pointer = new std::vector<int>(); 

後來的後來,你可以調用刪除上的指針,這破壞了對象並釋放內存:

delete vec_pointer; 

謝天謝地,動態分配並不是必需的,因爲它通常在其他語言中。聲明一個對象創建它,當它超出作用域時就會被銷燬。因此,我向您展示的簡單代碼行就足夠了,不需要刪除語句。

作爲一個方面說明,如果您確定,出於某種原因,您必須具有動態分配。使用智能指針(谷歌)。

+0

這很完美,你能否解釋我爲什麼做錯了? – Mitchell

+1

@Mitchell:你動態地分配了一個向量,取消了這個指針的值,將它複製到'vec'中,然後失去了對泄漏的分配內存的引用。 – GManNickG

2

您的程序正在泄漏內存。

std::vector<int> vec在棧上聲明一個向量。您在堆上創建第二個(空)矢量,並使用它來複制構建堆棧中的一個。由於它是空的,這實際上什麼都不做。

但是,您已經失去了指向堆上創建的向量的指針(因爲您從未存儲過它)。所以你不能刪除它,並且該內存不能被回收。然而,堆棧中的矢量本身就很好地清理了。

你可能想的就是休息:

std::vector<int> vec; // Vector on stack, no manual memory management required 

如果你真的想使用堆出於某種原因(堆棧速度更快,而且無論矢量對象本身就是一個小的固定大小的多少元素你把它,所以你不必擔心溢出的堆棧),你可以這樣做:

// Declare pointer to vector, and initialize it with a new vector on the heap 
std::vector<int>* vec = new std::vector<int>(); 

甚至(在C++ 11):

auto vec = new std::vector<int>(); 

然後,當你用它做:

delete vec;