似乎是一个简单的问题,但我对此表示怀疑。当我为使用运算符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/