我創建一個int在堆上這樣的載體:載體和釋放內存
std::vector<int> vec = *new std::vector<int>();
然後我得到我的節目的最後,我需要釋放內存,但使用vec.clear()
不會釋放內存。
我該如何正確做到這一點?
感謝所有最好的 -Mitchell
我創建一個int在堆上這樣的載體:載體和釋放內存
std::vector<int> vec = *new std::vector<int>();
然後我得到我的節目的最後,我需要釋放內存,但使用vec.clear()
不會釋放內存。
我該如何正確做到這一點?
感謝所有最好的 -Mitchell
我該怎麼做這個正常嗎?
替換此:
std::vector<int> vec = *new std::vector<int>();
有了這個:
std::vector<int> vec;
問題解決了。
與其他可能遇到的語言不同,在大多數情況下最好避免使用new
。它動態分配對象,就像其他語言一樣。但與其他語言不同,C++沒有垃圾收集器,因此您需要手動銷燬您動態分配的對象。但是,您編寫代碼的方式已經使您無法做到這一點。
你動態地分配一個新的對象,它返回一個指向對象的指針。然後,您將取消引用該指針(通過*),並將該對象複製到vec
。 vec
被正確銷燬,但從中複製的動態分配的對象不會。由於您沒有存儲該指針,因此無法訪問該對象,無法處理該對象。爲了摧毀目標,你將不得不捕獲指針,就像這樣:
std::vector<int>* vec_pointer = new std::vector<int>();
後來的後來,你可以調用刪除上的指針,這破壞了對象並釋放內存:
delete vec_pointer;
謝天謝地,動態分配並不是必需的,因爲它通常在其他語言中。聲明一個對象創建它,當它超出作用域時就會被銷燬。因此,我向您展示的簡單代碼行就足夠了,不需要刪除語句。
作爲一個方面說明,如果您確定,出於某種原因,您必須具有動態分配。使用智能指針(谷歌)。
您的程序正在泄漏內存。
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;
'* new'嗯,你爲什麼這樣做? – GManNickG
對於每一個新的你想刪除,所以刪除vec。 –
@brianbeuning:'vec'不是一個指針,也不是'new''。 – GManNickG