1

可能重复:
std::list::remove 方法是否调用每个已删除元素的析构函数?

假设我有这个:

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 持有的任何内存?

4

2 回答 2

3

是和不是。每个元素的析构函数都会被调用。但是,这不会产生您想要的效果。元素是 type X*,因此X*将调用 of 的析构函数(对指针类型没有任何作用),而不是您需要的 X 的析构函数。您需要明确删除您的元素。一般来说,如果你new的代码中有,应该有一个对应的delete.

于 2012-10-21T16:40:29.260 回答
1

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

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

你可以做的是创建一个std::list元素(而不是指向元素的指针)或者(如果你需要一个指针,例如,多态性)你可以使用智能指针来处理指向的元素,如果你喜欢这样。

于 2012-10-21T16:46:00.627 回答