2012-12-19 47 views
0

似乎它的简单问题,但我怀疑。请运营商delete销毁全部Object的元素当我拨打delete list非空列表用运营商创建new?当然会,但我需要确认。正如你所看到的Object有构造函数,但没有分配器。C++操作符新增并删除内存泄漏与容器

代码:

std::list<Object>* ptr_listObjects = new std::list<Object>(); 
OtherObject* ptr_null = NULL; 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
ptr_listObjects->push_back (Object(ptr_null, 'A')); 
delete ptr_listObjects; // no any possible memory leaks? (Object does not use `new` operator) 


class Object 
{ 
public: 
    Object(OtherObject* ptr_other, char xxx): 
    ptr_OtherObject(ptr_other), 
    charflag(xxx) 
    {} 


    OtherObject* ptr_OtherObject; 
    char charflag; 
}; 
+0

我很确定它会。但处理这种情况的最简单方法是创建一个析构函数,用于输出消息并查看是否有输出。 – StoryTeller

+0

我假设你的意图是*不*在本示例中练习类[Object]的[Rule of Three](http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))。有时你不需要(对象不“拥有”ptr_OtherObject对象),但很难说这是否是其中的一种。希望你会知道(这是毕竟你的代码)。 – WhozCraig

+0

请检查一下http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/smart_ptr.htm – czchlong

回答

6

std::list析构函数运行,因此将它的元素的析构函数。那就是说,你为什么要动态地分配一个容器来开始?您正在让容器无法为您管理内存。让它做好工作;分配具有自动存储持续时间的列表。

顺便说一句,Object确实有有析构函数,编译器会为您生成一个空的函数。虽然没有什么要清理的,所以它什么都不做。另外,从类设计中可以清楚地看出,Object的实例不拥有它的构造函数所需的指针,因此除非明显改变设计,否则请务必不要释放它。

+0

+1或者至少在智能指针中包装该列表。 – WhozCraig

+0

谢谢。我动态地分配它,因为我1)在许多函数中使用它,并通过函数将指针传递给它2)然后我将它存储大约30分钟,并且只有我可以用操作符'delete'来销毁它。.. – abrahab

+0

@abrahab:There是其他方式。我可以诚实地说,我从未动态分配过这样的容器(并且我每天都编写C++代码,当然,这并不意味着我遇到过所有情况)。您可以通过引用将容器传递给函数。如果这不起作用,那么你应该把它作为'unique_ptr >'来维护。智能指针会为您解除分配。我可以想到做你正在做的事情没有什么好的理由。 –