[英]C++ , Erasing Vector
我是cpp的新手,我用此代碼定義了一個向量,最后我想完全刪除它。
#include <string>
#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;
struct MCLASS
{
string *a = new string();
string *b = new string();
MCLASS(string ax,string bx)
{
a = new string(ax);
b = new string(bx);
}
~MCLASS()
{
delete a;
delete b;
}
};
vector<MCLASS*> *vc = new vector<MCLASS*>;
int main()
{
for (int i = 0 ; i <= 1000000 ; i++)
vc->push_back(new MCLASS("EHEM","UHUM"));
for (int i = 0 ; i <= 1000000 ; i++)
delete vc->at(i);
vc->clear();
delete vc;
cout<<"Deleted";
cin.get();
return 0;
}
但是有一個問題。我無法完全擦除它。我試圖刪除矢量的每個項目,清除矢量項目,然后將其刪除。但是當我檢查此應用程序的RAM使用情況時,它使用了約130MB。請向我該怎么辦。謝謝!
您正在為每個成員變量調用兩次new string
。 對於每個new string
,第二次調用new string
的結果都會覆蓋第一個new string
的結果,因此第一個永遠不會被delete
d,這會導致內存泄漏。
不要在a
和b
的聲明中調用new string
僅在構造函數中。
struct MCLASS
{
string *a;
string *b;
...
來自cplusplus.com關於vector::clear
的文章 :
由於調用此函數,不能保證會發生重新分配,也不保證矢量容量會發生變化。 強制重新分配的典型替代方法是使用swap:
vector<T>().swap(x); // clear x reallocating
vector<T>().swap(x); // clear x reallocating
正如弗拉基米爾(VladimirS)在評論中所建議的那樣; 內存管理不是一個簡單的野獸,但是上述操作應該減少您的內存消耗,前提是沒有任何事情可以通過替換Delete來阻止它(例如某些內存檢查工具)。
您的錯誤發生在第10-11行:
string *a = new string();
string *b = new string();
確實,您創建了兩個指針a和b並為它們分配了內存,因為您在不檢查值的情況下在構造函數中重新分配了新內存,所以您將永遠無法釋放內存。
解決該問題(正確的做法)的正確方法是將指針屬性初始化為NULL 。 在您的情況下,請按以下方式替換這些行:
string *a = NULL;
string *b = NULL;
然后,將其分配在構造函數中或某個地方...
溫馨提示 :
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.