std :: list的擦除成员函数是否为所有存储的元素调用析构函数?

埃斯瓦特

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

在阅读的文档时std::list::erase,我看到了以下声明

“这有效地减少了容器尺寸,减少了被破坏的元素的数量。”

我很难理解这一说法。例如,请考虑以下设置:

class demo {

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

现在,假设我打电话给mylist.erase(iterator of list)我以为这将调用class的析构函数demo,但似乎没有,这似乎与“被摧毁”的说法相矛盾。

你能帮我吗?

谢谢!

templatetypedef

当您调用clear()列表方法时,它将破坏存储在列表内部的所有对象。你的情况,你有一个列表demo*s此意味着每一个的三分球将被销毁,因为指针存储在列表中,但指针对象不会被破坏,因为指针对象不会存储在列表内。换句话说,销毁指针与调用delete这些指针中的每一个都不相同因此,如果原始指针拥有它们指向的对象,通常不建议将原始指针存储在容器类型中,因为如您所见,析构函数不会自动调用。

现在,另一方面,假设您有一个list<unique_ptr<demo>>在这种情况下,调用clear()将销毁unique_ptr<demo>列表中的所有。反过来,这将释放unique_ptrs所指向的对象,因为销毁aunique_ptr也会销毁它所指向的对象。之所以unique_ptr可行,是因为拥有所有权的想法,并且意识到当对象本身被销毁时,它需要销毁它所指向的对象。

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

std :: remove_if是否调用析构函数?

std::map 对象析构函数被调用?

当对象绑定到成员函数时,为什么std :: function会调用析构函数?

std :: list <std :: future>析构函数不会阻止

无法手动调用std :: string的析构函数

std :: move意外调用析构函数

如何显式调用 std 迭代器的析构函数?

什么时候调用std :: thread析构函数?

为优化级别为 0 的 std::vector 调用两次析构函数

std :: enable_shared_from_this:是否可以在析构函数中调用shared_from_this()?

std::any_cast 是否调用析构函数?演员阵容如何?

std :: unique_ptr是否在其析构函数中将其基础指针设置为nullptr?

在std :: swap中进行有害的析构函数调用

为什么在抛出我的析构函数时没有调用 std::terminate

为 std::tuple 的每个元素调用成员函数

std :: vector中的元素可能具有抛出的析构函数吗?

是否可以在不调用 std async 的情况下使用阻塞析构函数创建 std 未来?

可连接std :: thread的析构函数

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

为什么std :: vector的构造函数调用自定义类的析构函数?

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

std :: unique_ptr析构函数构造函数顺序

从对象原因到此类的调用析构函数的c ++ std :: thread调用方法

使用std :: function作为成员函数,该函数捕获`this`,并在析构函数之后从复制的lambda中对其进行访问

为什么std :: vector在离开其他作用域的同时调用析构函数?

如何在不调用析构函数的情况下将值移出 std:optional ?

thread_local std :: unique_ptr版本未调用析构函数

指向包含std :: string的对象的指针上的无效指针调用析构函数

为什么std :: shared_ptr两次调用我的析构函数?