可能重复:
Does std::list::remove method call destructor of each removed element?
假设我有这个:
void f(...)
{
.
.
std::list<X*> xList;
.
// Then i fill the list
std::list<X*>::iterator iter;
for (iter = xList.begin(); iter != xList.end(); ++iter)
{
*iter = new X();
}
}
当xList超出范围时,我知道容器应该调用列表中包含的对象的析构函数吗?首先,这是真的吗?
如果是这样,那么由于列表包含指向X类的指针,当xList超出范围时,不应该调用X的析构函数吗?从而释放X持有的所有内存?
答案 0 :(得分:3)
是和否。
将调用每个元素的析构函数。
但是,这不会产生您想要的效果。元素的类型为X*
,因此将调用X*
的析构函数(对指针类型不执行任何操作),而不是您需要的X的析构函数。您需要明确删除您的元素。一般情况下,如果代码中有new
,则应该有相应的delete
。
答案 1 :(得分:1)
在C ++标准库设计中,容器是包含元素的唯一所有者,因此当容器被销毁时,所有元素都将被销毁。
但请注意,在C ++中“销毁”裸指针是一种无操作,因此不会删除指向的元素(裸指针可能指向静态分配的数据或某些其他容器所拥有的数据)
你可以做的是创建一个std::list
个元素(而不是指向元素的指针)或(如果你需要一个指针,例如,因为多态),你可以使用智能指针如果你愿意,可以照顾尖头元素。