智能指针(唯一指针)总是优于普通指针吗?

时间:2015-02-12 19:22:26

标签: c++

智能指针在超出范围时会自动解除分配(删除)。 是否存在智能/唯一指针在我们仍然希望它可用时被删除的情况?

换句话说,我们什么时候应该使用哪个指针,或者我们可以一直使用唯一指针?

3 个答案:

答案 0 :(得分:2)

假设预期的问题确实是

  

有没有普通指针优于唯一指针的情况?

(如a comment by the OP所示),答案是明确的

std::unique_ptr拥有对象的唯一所有权。

如果你不想拥有所有权,只是观察和访问一个对象,就需要一个原始指针 - 或一个功能等同的抽象 - 来避免参与自动破坏性行为。

这些是对象指针的最常见用法。输出一个字符串文字,你已经使用了这样一个指针,即一个指向字符数组(第一项)的指针。声明main的参数,你又有了这样一个指针。他们几乎无处不在。操作词可能是“无处不在”,很常见,以至于没有人注意到它们。

答案 1 :(得分:1)

您正在将智能指针与unique_ptr混为一谈。当需要shared_ptr样式管理时,显然unique_ptr将不起作用,因此您不能说它是"始终"优于普通指针。普通指针至少会允许共享访问,尽管管理会更难。

答案 2 :(得分:1)

C ++编程的一个重要原则是Resource Acquisition Is Initialization,它实现了自动清理资源的重要属性。这对于使C ++代码异常安全尤为重要。您不太可能忘记清理,无论您是否实际使用C ++异常处理,您编写的C ++代码都是相同的。

智能指针是一种在C ++中实现RAII的方法。

C ++ 11标准std::unique_ptr适用于单个实体仅由拥有的内容。当该实体被销毁时,它所拥有的东西应立即清理。

std::shared_ptr用于在多个实体之间共享所有权的东西,并且它实际被删除的唯一时间是所有对它的引用都消失了。具体而言,您实际上并不确定哪个实体将是“最后一个实体”。

对于使用COM对象的Microsoft平台,您应该使用Microsoft::WRL::ComPtr<T>。对于使用C ++ / CX语言扩展的WinRT编程,T^是相同的。

所有此类引用都是“强大”引用,它们保证了所有权。您还可以对同一资源进行“弱”引用,在std::unique_ptrMicrosoft::WRL::ComPtr<T>的情况下,这只是一个原始指针。弱引用允许您引用该对象,但对该对象的所有权状态进行 no 声明。

因此,原始指针非常适合作为参数传递给函数,这些参数将按顺序执行(而不是异步执行),调用遗留函数等。只要您保证“强烈拥有”,它们都可以正常工作当有人对同一件事物使用弱引用时,对象不能被破坏。

实际上,这意味着您可能希望在类私有数据成员中使用智能指针来保留您创建的资源并希望在类的生命周期中存在,但是您可以而且应该使用原始指针作为对仅需要临时使用资源的函数的弱引用。

可以当然将智能指针作为参数传递,但是你想做const参考:

void function(const std::unique_ptr<T>& data);

但它可能更容易和更方便使用(并且能够更容易地与可能不使用相同智能指针的其他代码交互):

void function(T* data);

现在,如果你真的要返回一个新的对象或取得所有权,那么使用类似的东西会更有意义:

std::unique_ptr<T> function();

void function(std::unique_ptr<T>& data);

请参阅Smart PointersComPtrDual-use Coding Techniques for Games