似乎是一个简单的问题,但我对此表示怀疑。当我为使用运算符delete创建的非空列表调用Object时,运算符delete list是否会销毁所有new的元素?可以,但是我需要确认。如您所见,Object具有构造函数,但没有分配器。

码:

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

最佳答案

std::list析构函数将运行,其元素的析构函数也将运行。也就是说,为什么要从头开始动态分配容器?您使容器无法为您管理内存。让它做好自己的工作;分配具有自动存储期限的列表。

顺便说一句,Object确实有一个析构函数,编译器会为您生成一个空的析构函数。虽然没有什么要清理的,所以它什么也没做。同样,从类设计中可以清楚地看到,Object的实例并不拥有其构造函数中使用的指针,因此请确保从不释放它,除非您进行了重大更改。

关于c++ - C++操作符新和删除容器的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13958576/

10-13 08:27
查看更多