在简单的例子中,很容易说
“想要共享资源时使用
shared_ptr
,unique_ptr
获取唯一所有权,否则请通过const &
或*
访问指针”
在非平凡的代码中(在我的例子中,游戏引擎),有许多领域:
shared_ptr
或unique_ptr
是否会被传递。如果库类出于任何原因存储指向对象的指针,则这尤其成问题。shared_ptr
,有时也可以是unique_ptr
,具体取决于其用途。 因此,大多数时候,原始指针被传递,然后有时被用户存储(甚至库本身 - 这可能不是很好的设计,但是使用非平凡的代码,这变成了常见的做法,否则必须改变底层接口。)
当用户在unique_ptr
或shared_ptr
销毁对象时尝试取消引用原始指针时,使用原始指针可以(并且确实)导致未定义的行为。追踪这些错误的来源(谁删除了什么以及什么时候)是一场噩梦,特别是对于腐败的调用堆栈。
一个可以在某些情况下使用weak_ptr
并安全地获得shared_ptr
,但不仅仅是shared_ptr
和weak_ptr
重量比较对于原始指针(或unique_ptr
),无法预测对象是否始终存储为shared_ptr
。也许它存储为unique_ptr
。
那么我的问题是,可以构建一个半智能指针,例如safe_ptr
其中shared_ptr
或 unique_ptr
可以转换为safe_ptr
,即safe_ptr
成为所有智能指针的默认访问权限。 safe_ptr
本身在发布版本中被编译为原始指针,但在调试版本中,如果对象被shared_ptr
和{{1}销毁,则在指针解除引用时会提供有价值的信息。并触发一个调试中断(无论如何程序都会以未定义的行为崩溃!)