C ++,擦除矢量

时间:2016-07-06 14:45:32

标签: c++ vector struct

我是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。请向我解释做什么。谢谢!

4 个答案:

答案 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;

然后,在构造函数或某个地方分配它......

提示

  • 删除 之前,请检查当前值;)
  • 使用 Valgrind 或类似工具检查内存泄漏