我应该总是在C ++ 11中使用智能指针

时间:2014-02-12 17:14:25

标签: c++ c++11 shared-ptr

从c ++ 11开始,我可以在不创建和删除原始指针的情况下编写代码。 但它是正确的方法 - 我应该总是使用智能指针(共享,独特或弱)或者我应该自己删除对象吗?

2 个答案:

答案 0 :(得分:17)

很难想象你想要手动删除一个对象的情况,所以从这个意义上说,问题的答案是“是的,总是使用智能指针”。

但是,原始指针确实有另一个用例。智能指针都是关于赋予所有权语义。 unique_ptr拥有它指向的对象的独占所有权,并且当指针超出范围时将销毁该对象。 shared_ptr实现共享所有权,当最后一个共享指针超出范围时,该对象将被销毁。

对于想要指向对象指示任何类型的所有权的情况,原始指针仍然有用。你只是指向一个你知道存在的对象,而其他人(谁拥有它)会在时机成熟时删除它。

原始指针用于指向对象。智能指针用于拥有对象。

答案 1 :(得分:1)

很少有你想要使用智能的情况 指针。在大多数应用程序中,大多数删除都是 delete this,或者如果应用程序是事务性的,那么 事务管理器将负责删除。在案件 这不适用,你通常不想使用 动态分配开始。你唯一的时间 使用智能指针:

  • 由于某种原因,您无法完全使用该对象 在构造函数中运行,但必须跟进 活动前的其他操作。在这种情况下,它使 感觉将它保持在std::unique_ptr直到对象为止 完全有效,然后拨打release

  • 你真的想要价值语义,但你也需要 多态性。在这种情况下,请使用某种共享指针。 (但要注意周期。)如果对象是可变的,请注意, 因为你最终会得到参考语义。

  • 你真的想要价值语义(带深拷贝),但是 分析器显示复制的成本太高,你可能会 还考虑某种共享指针。这有它 危险,但对于大块不可变数据,可能是一个好处 溶液

但对于初学者来说,你应该总是问自己:为什么 我动态分配这个对象。最常见的有效 原因是它是一个实体对象,具有生命周期定义 通过程序逻辑(即它的生命周期由于一些结果而结束) 外部事件)。在这种情况下,智能指针会带来更多 他们解决的问题。