c++ - std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?

标签 c++ list pointers std destructor

我正在调试一个内存问题,它与 std::list::erase 方法有某种关系。

在阅读 std::list::erase 的文档时,我看到了 this statement :

"This effectively reduces the container size by the number of elements removed, which are destroyed."

我很难理解这个陈述。例如,请考虑以下设置:

class demo {

};
std::list<demo *> mylist;

现在,假设我调用 mylist.erase(iterator of list)。我以为这会调用 demo 类的析构函数,但似乎并没有,这似乎与“which are destroyed”的说法相矛盾。

你能帮我解决这个问题吗?

谢谢!

最佳答案

当您调用 clear()列表的方法,它将销毁列表中存储的所有对象。在您的情况下,您有一个列表 demo* s 这意味着每个 pointers 都将被销毁,因为 pointers 存储在列表中,但 pointees 不会被销毁因为 pointees 没有存储在列表中。换句话说,销毁指针与调用 delete 不同。在每个指针上。因此,如果原始指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为正如您刚刚看到的那样,不会自动调用析构函数。

现在,另一方面,假设您有一个 list<unique_ptr<demo>> .在这种情况下,调用 clear()将销毁所有 unique_ptr<demo>在列表中。这反过来将释放 unique_ptr 中的对象。 s point at,因为摧毁了一个unique_ptr也会破坏它指向的对象。这是有效的,因为 unique_ptr有所有权的想法,并意识到它需要在它自己销毁时销毁它指向的对象。

希望这对您有所帮助!

关于c++ - std::list 的 erase 成员函数是否为所有存储的元素调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038010/

相关文章:

c++ - 这些 Visual Studio 2010 错误和警告的原因是什么?

list - 错误 "Cannot find variable `。 .`"尝试使用范围运算符时

java - remove() 方法太慢

C++:如何初始化以下 std::shared_ptr 构造函数数组

c++ - C中的结构内存布局

c - 指针和字符串操作

java - 使用 OpenGL 调整图像大小

c++ - 如何在不改变 QPlainTextEdit 类焦点的情况下检测文本的变化?

c++ - C++类定义中的第三个词

java - 如何使用另一个列表的项目来初始化列表?