容器超出范围和内存管理

时间:2012-10-21 16:35:15

标签: c++ stdlist

  

可能重复:
  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持有的所有内存?

2 个答案:

答案 0 :(得分:3)

是和否。 将调用每个元素的析构函数。 但是,这不会产生您想要的效果。元素的类型为X*,因此将调用X*的析构函数(对指针类型不执行任何操作),而不是您需要的X的析构函数。您需要明确删除您的元素。一般情况下,如果代码中有new,则应该有相应的delete

答案 1 :(得分:1)

在C ++标准库设计中,容器是包含元素的唯一所有者,因此当容器被销毁时,所有元素都将被销毁。

但请注意,在C ++中“销毁”裸指针是一种无操作,因此不会删除指向的元素(裸指针可能指向静态分配的数据或某些其他容器所拥有的数据)

你可以做的是创建一个std::list个元素(而不是指向元素的指针)或(如果你需要一个指针,例如,因为多态),你可以使用智能指针如果你愿意,可以照顾尖头元素。