c – 将析构函数添加到std :: list时调用对象
发布时间:2020-12-16 06:44:27 所属栏目:百科 来源:网络整理
导读:我有一个Foo对象,一个std :: list包含它的实例.我的问题是,当我向列表中添加一个新的实例时,它首先调用ctor,然后再调用dtor.然后在另一个实例上的dtor(根据这个指针). 单个实例被添加到列表中,但是由于其dtor(以及其父节点)被调用,所以该对象不能按预期使用.
我有一个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库. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ruby-on-rails – 基于QueryString设置Rails路由
- reactjs – 在反应原生的app启动中获取后台数据?
- .net – 将列表的枚举器传递给函数
- 开发板2440nor flash与nand flash启动的简单比较
- 在PostgreSQL(可能还有其他引擎)中,为什么UNION语句认为NUL
- jmeter接口测试多数据组合登陆场景
- DWR3.0 dwr 返回值(数组,集合,Map)
- swift开发笔记8 - sqlite3数据的使用(xcode 7,ios9)
- sqlite – 在Qt中使用sqlalchemy的原因
- Entity Framework 连接操作 Sqlite 数据库