我是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。请向我解释做什么。谢谢!
答案 0 :(得分:2)
您每个成员变量调用new string
两次。对于每一个,第二次调用new string
的结果会覆盖第一个的结果,所以第一个永远不会得到delete
d并且存在内存泄漏。
请勿在{{1}}和new string
的声明中调用a
- 仅在构造函数中。
b
答案 1 :(得分:2)
来自vector::clear
上的cplusplus.com article:
无法保证重新分配,并且由于调用此函数,无法保证向量容量发生变化。强制重新分配的典型替代方法是使用swap:
vector<T>().swap(x); // clear x reallocating
正如弗拉基米尔在评论中所说的那样;内存管理不是一个简单的野兽,但上面应该减少你的内存消耗,只要没有通过替换删除(如一些内存检查工具)阻止它。
答案 2 :(得分:0)
如果要删除std::vector
的所有内容,可以调用clear成员函数或将resize调用为零。
结果略有不同。 clear
会破坏所有元素,但(可能)会保留向量容量。 resize(0)
将破坏所有元素并将容量减少到零。
答案 3 :(得分:0)
您的错误发生在第10-11行:
string *a = new string();
string *b = new string();
确实,你创建了两个指针 a 和 b ,你分配对于他们来说,内存永远不会免费,因为你在构造函数中重新分配新内存而不检查值。
解决这个问题(以及良好实践)的正确方法是将指针属性初始化为 NULL 。在你的情况下,替换这样的行:
string *a = NULL;
string *b = NULL;
然后,在构造函数或某个地方分配它......
提示: