c – 将析构函数添加到std :: list时调用对象

c – 将析构函数添加到std :: list时调用对象,第1张

概述我有一个Foo对象,一个std :: list包含它的实例.我的问题是,当我向列表中添加一个新的实例时,它首先调用ctor,然后再调用dtor.然后在另一个实例上的dtor(根据这个指针). 单个实例被添加到列表中,但是由于其dtor(以及其父节点)被调用,所以该对象不能按预期使用. 还有一些简化的代码来说明问题: #include <iostream>#include <list>clas 我有一个Foo对象,一个std :: List包含它的实例.我的问题是,当我向列表中添加一个新的实例时,它首先调用ctor,然后再调用dtor.然后在另一个实例上的dtor(根据这个指针).

单个实例被添加到列表中,但是由于其dtor(以及其父节点)被调用,所以该对象不能按预期使用.

还有一些简化的代码来说明问题:

#include <iostream>#include <List>class Foo{public:    Foo()    {         int breakpoint = 0;    }    ~Foo()    {         int breakpoint = 0;    }};int main(){    std::List<Foo> li;    li.push_back(Foo());}
解决方法 当你push_back()你的Foo对象时,该对象被复制到列表的内部数据结构中,因此调用另一个实例的Dtor和Ctor.

C中的所有标准STL容器类型通过值获取其项目,因此根据需要进行复制.例如,每当向量需要增长时,矢量中的所有值都可能被复制.

也许你想要在列表中存储指针而不是对象.通过这样做,只有指针被复制而不是对象.但是,通过这样做,您必须确保在完成后删除对象:

for (std::List<Foo*>::iterator it = List.begin(); it != List.end(); ++it) {    delete *it;}List.clear();

或者,您可以尝试使用某种“智能指针”类,例如来自Boost库.

总结

以上是内存溢出为你收集整理的c – 将析构函数添加到std :: list时调用对象全部内容,希望文章能够帮你解决c – 将析构函数添加到std :: list时调用对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1251206.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存