混合 shared_ptr 和普通 ptr

Mixing shared_ptr and a normal ptr

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

现在如果我声明:

char * borrowerPtr;

然后这样做:

borrowerPtr = OwnerSharedPointer.get();

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

视情况而定。

如果 borrowerPtr 仅在 OwnerSharedPointer 的生命周期内使用,这很好。被指派者仍会好好活着。

如果 OwnerSharedPointer 在您访问 borrowerPtr 之前被销毁,并且没有其他 std::shared_ptr 指向指针对象,您将被推入未定义行为的黑暗领域。不要这样做。

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

Is there anything wrong with this?

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

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