安全地使用从unique_ptr或shared_ptr

时间:2016-04-20 16:37:51

标签: c++ smart-pointers

在简单的例子中,很容易说

  

“想要共享资源时使用shared_ptrunique_ptr获取唯一所有权,否则请通过const &*访问指针”

在非平凡的代码中(在我的例子中,游戏引擎),有许多领域:

  • 库类不容易预测对象的shared_ptrunique_ptr是否会被传递。如果库类出于任何原因存储指向对象的指针,则这尤其成问题。
  • 对象有时可以是shared_ptr,有时也可以是unique_ptr,具体取决于其用途。
  • 用户一直搞砸(可能是我,使用我自己的游戏引擎)

因此,大多数时候,原始指针被传递,然后有时被用户存储(甚至库本身 - 这可能不是很好的设计,但是使用非平​​凡的代码,这变成了常见的做法,否则必须改变底层接口。)

当用户在unique_ptrshared_ptr销毁对象时尝试取消引用原始指针时,使用原始指针可以(并且确实)导致未定义的行为。追踪这些错误的来源(谁删除了什么以及什么时候)是一场噩梦,特别是对于腐败的调用堆栈。

一个可以在某些情况下使用weak_ptr并安全地获得shared_ptr,但不仅仅是shared_ptrweak_ptr重量比较对于原始指针(或unique_ptr),无法预测对象是否始终存储为shared_ptr。也许它存储为unique_ptr

那么我的问题是,可以构建一个半智能指针,例如safe_ptr其中shared_ptr unique_ptr可以转换为safe_ptr,即safe_ptr成为所有智能指针的默认访问权限。 safe_ptr本身在发布版本中被编译为原始指针,但在调试版本中,如果对象被shared_ptr和{{1}销毁,则在指针解除引用时会提供有价值的信息。并触发一个调试中断(无论如何程序都会以未定义的行为崩溃!)

0 个答案:

没有答案