混合 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?
可能吧。我可以想到两种情况:
- 函数在指针上调用
delete
。
- 共享指针的引用计数变为 0,指针在
borrowerPtr
使用前被删除。
我有一个 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?
可能吧。我可以想到两种情况:
- 函数在指针上调用
delete
。 - 共享指针的引用计数变为 0,指针在
borrowerPtr
使用前被删除。