当前位置:  开发笔记 > 编程语言 > 正文

在将对象添加到std :: list时,析构函数调用了对象

如何解决《在将对象添加到std::list时,析构函数调用了对象》经验,为你挑选了1个好方法。

我有一个Foo对象,一个std :: list包含它的实例.我的问题是,当我向列表中添加一个新实例时,它首先调用ctor,然后调用dtor.然后是另一个实例上的dtor(根据this指针).

单个实例被添加到列表中,但由于调用了dtor(及其父项),因此无法按预期使用该对象.

下面是一些简化的代码来说明问题:

#include 
#include 

class Foo
{
public:
    Foo()
    { 
        int breakpoint = 0;
    }
    ~Foo()
    { 
        int breakpoint = 0;
    }
};

int main()
{
    std::list li;
    li.push_back(Foo());
}

Ferdinand Be.. 14

当你push_back()你的Foo对象时,该对象被复制到列表的内部数据结构,因此调用另一个实例的Dtor和Ctor.

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

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

for (std::list::iterator it = list.begin(); it != list.end(); ++it) {
    delete *it;
}
list.clear();

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



1> Ferdinand Be..:

当你push_back()你的Foo对象时,该对象被复制到列表的内部数据结构,因此调用另一个实例的Dtor和Ctor.

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

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

for (std::list::iterator it = list.begin(); it != list.end(); ++it) {
    delete *it;
}
list.clear();

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

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有