2016-07-06 52 views
0

我是新的cpp.I定义了一个向量与此代码,并在最后,我想完全擦除它。C++,删除向量

#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; 
} 

但有一个疑难问题无法抹去它completely.I试图删除向量,向量明确项目的每个项目,并删除它。但是当我检查这个应用程序的内存使用,它使用约130MB.Please向我解释做什么。谢谢!

+4

您需要阅读操作系统的内存模型。总之:大部分时间竞技场并没有减少到有更好的表现。 – VladimirS

+1

您不应该使用所有这些指针...... – Jarod42

+1

您可以通过不使用* raw指针*并声明不带'new'的变量来减轻这些指针问题。如果你*必须*使用指针使用*智能指针*。 –

回答

2

您对每个成员变量调用new string两次。对于每一个,第二次调用new string的结果会覆盖第一个的结果,所以第一个结果永远不会得到deleted,并且存在内存泄漏。

不要在ab的声明中调用new string - 只能在构造函数中使用。

struct MCLASS 
{ 
    string *a; 
    string *b; 
... 
+2

或者更好的是,使用一个成员变量:struct MCLASS {string a,b; MCLASS(字符串ax,字符串bx){a = ax; b = bx; } ....}' – majk

+0

majk是对的,当然没有实际需要显式地分配堆内存。更好的做法(不仅仅是因为它有助于避免泄漏)直接使用容器对象,而不是指向它们的指针。但是,如果每个'new'都由一个'delete'平衡,那么这不是你报告的问题的根源。 – jez

+0

是的,你是对的,我错了。谢谢你的回答。 –

0

如果你想删除一个std::vector的所有内容,您可以调用的clear成员函数或resize它的大小为零。

结果稍有不同。 clear将销毁所有元素,但可能会保留向量容量。 resize(0)将销毁所有元素,并将容量减少到零。

+0

如果包含指针会导致内存泄漏,它不会在其成员上调用delete。 – majk

+2

我会争辩说,如果它包含指针并且想要它们被删除(如,vector *拥有*指针),那么vector *应该*已经持有智能指针,这就是您应该修复的错误。 –

+1

你完全正确。只是为了完整性而想包括它。 – majk

0

你的错误发生在10-11行:

string *a = new string(); 
string *b = new string(); 

事实上,你创建两个指针一个b,你分配记忆对他们来说,记忆你”将永远不会免费,因为您在构造函数中重新分配新的内存而不检查值。

有道解决这个问题(和良好做法)是初始化指针属性NULL。在你的情况下更换这些线路这样的:

string *a = NULL; 
string *b = NULL; 

然后,在构造函数或分配的地方吧...

提示

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

从CPLUSPLUS。COM的articlevector::clear

重新分配并不一定会发生的,和矢量能力不能保证因调用此函数改变。强制再分配的典型方法是使用交换: vector<T>().swap(x); // clear x reallocating

由于VladimirS在他的评论中建议;内存管理不是一个简单的野兽,但是如果没有阻止替换删除(如一些内存检查工具),上面的内容应该会减少内存消耗。

+0

是的,但在这种情况下,错误不在这里。我发布了一个解释他错误的答案。 @Alexei Barnes – N0un

+0

@ N0un这是真的,但这个问题形成不好,实际上有几个问题,我已经回答了一部分,这个答案解决了问题的另一方面。 –

+0

是的,你的文章很有趣! – N0un