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

Should i always use smart pointer in C++ 11

本问题已经有最佳答案,请猛点这里访问。

从C++ 11我可以编写代码而不创建和删除原始指针。但这是正确的方法吗?我应该始终使用智能指针(共享、唯一或弱指针)还是在某些情况下应该自己删除对象?


很难想象您想要手动删除对象的情况,因此从这个意义上来说,问题的答案是"是的,总是使用智能指针"。

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

对于希望指向对象而不指示任何所有权的情况,原始指针仍然有用。你只是指向一个你知道存在的对象,而其他人(拥有它的人)会在时间到来时删除它。

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


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

  • 由于某些原因,您无法使对象完全在构造函数中操作,但必须跟进活动之前的其他动作。在这种情况下,它使将其保持在EDCOX1×3中,直到对象是完全激活,然后调用release

  • 你真的想要值语义,但你也需要多态性。在这种情况下,使用某种共享指针。(但要注意周期。)如果物体是可变的,也要注意,因为您将以引用语义结束。

  • 您确实需要值语义(使用深度复制),但是探查器显示复制成本太高,您可能还要考虑某种共享指针。这有它的危险,但对于大量不可变的数据,可能是一个好的解决方案。

但首先,你应该问问自己:为什么我动态地分配这个对象。最频繁的有效原因是它是一个实体对象,定义了生存期按程序逻辑(即,由于某些外部事件)。在这种情况下,智能指针将导致更多他们解决不了的问题。