一般来说,智能指针如std::unique_ptr
和Glib::RefPtr
在重新分配指向另一个对象时会删除它们的对象,因为它们是保存给定对象的唯一指针(显然在std::unique_ptr
的情况下隐含)?重新分配智能指针
重新分配智能指针
回答
对于unique_ptr::reset
,[unique.ptr.single.modifiers]/4:
影响:分配
p
所存储的指针,然后如果所存储的指针,old_p
的旧值,不等于nullptr
,请致电get_deleter()(old_p)
。在[unique.ptr.single.asgn]/2
或者移动赋值运算符,operator=(unique_ptr&& u)
:
转会所有权从
u
到*this
仿佛通过调用reset(u.release())
随后get_deleter() = std::forward<D>(u.get_deleter())
。
(等效为其他赋值运算符模板)
对于
shared_ptr
,调动是有一点点不同。
shared_ptr
永远不会销毁一个被引用的对象,因为它不是最后一个拥有它的对象,所以让我们假设这是给定的。
shared_ptr::reset(Y*)
指定在[util.smartptr.shared.mod]/3:
影响:等价于
shared_ptr(p).swap(*this)
。
但是很明显,临时函数在函数调用结束时被破坏,破坏了保持对象(如果适用)。
即相同的行为operator=(shared_ptr<> const&)
具有[util.smartptr.shared.assign]/1和4:
影响:等价于
shared_ptr(r).swap(*this)
。
...移动赋值运算符(模板),r
是shared_ptr<>&&
:
影响:等价于
shared_ptr(std::move(r)).swap(*this)
。
如果*this
是最后拥有的对象,那么现在临时是 - 将被销毁。
对于Glib::RefPtr
的情况类似于shared_ptr
:副本赋值运算符(和赋值运算符模板)与相同的语义定义。如果当前的RefPtr
被分配给其他值,则当前保持对象引用计数器递减并且如果结果计数器值为零则将其销毁。
对于unique_ptr答案是肯定的:
的对象被破坏,当任一 之后发生开发它的内存释放:
- 的unique_ptr管理对象被销毁
- unique_ptr通过operator =或reset()指定管理对象的另一个指针。
的目的是使用一种潜在的用户提供的删除器通过调用 删除器(PTR)破坏。删除者调用对象 的析构函数并分配内存。
- 1. 在重新分配指针后使用类指针功能
- 2. Boost智能指针
- 3. C++智能指针
- 4. 重新分配一个指针?
- 5. 在descructor中重新分配指针
- 6. python指针内存重新分配
- 7. 困惑这些指针重新分配
- 8. 智能指针在智能指针管理数组内
- 9. 指针指针和重新分配在C
- 10. 双指针和重新分配空指针
- 11. 指针和智能指针的区别
- 12. 智能指针代替指针
- 13. 在条件或循环中分配智能指针
- 14. 智能指针和参数列表分配规则
- 15. 如何跟踪使用智能指针时的内存分配
- 16. 是否将智能指针分配给_variant_t需要手动AddRef()?
- 17. 智能指针和自定义内存分配困境
- 18. 正在重新分配的指针未被分配
- 19. GMP和智能指针
- 20. C++:实现智能指针
- 21. 智能指针与PythonQt
- 22. C++智能指针表现
- 23. C++中的智能指针
- 24. 激活智能指针?
- 25. 智能指针::地图
- 26. 二叉树智能指针
- 27. 智能指针三规则?
- 28. 数组和智能指针
- 29. 智能指针和dynamic_cast
- 30. 智能指针类predeclaration
RefPtr something = getSomething(); something = getSomethingElse();工作正常。你不需要使用RefPtr :: swap()。当然,这里的重新分配只是减少了第一个东西的引用,而不是删除它。它是一个引用计数_shared_智能指针。 –
murrayc
2014-12-07 19:18:04
@murrayc我第一次阅读时必须误读文档。谢谢! – Columbo 2014-12-07 19:44:27