混合shared_ptr和正常的PTR

Mixing shared_ptr and a normal ptr

本文关键字:PTR shared ptr 混合      更新时间:2023-10-16

我有一个shared_ptr指向动态分配的char内存缓冲区。让我称之为shared_ptr OwnerSharedPointer.

现在,如果我声明:

char * borrowerPtr;

并这样做:

borrowerPtr = OwnerSharedPointer.get();

并将borrowerPtr传递给某个函数,该函数最终使用存储在分配内存中的数据。这有什么问题吗?

这有什么问题吗?

可能。我可以想到两种情况:

  1. 该函数在指针上调用delete
  2. 共享指针的引用计数变为 0,并且在使用borrowerPtr之前删除了指针。

这取决于。

如果borrowerPtr仅在OwnerSharedPointer的生命周期内使用,这很好。尖头仍然会活得很好。

如果在你访问borrowerPtr之前OwnerSharedPointer被摧毁,并且没有其他std::shared_ptr对脚尖的引用,你就会被推入不确定行为的黑暗领域。别这样。

如果您不知道OwnerSharedPointer是否会在访问borrowerPtr之前被销毁,请改用std::weak_ptr。这提供了对点的检查访问权限,而不会增加所有者计数。