混合shared_ptr和普通ptr

时间:2016-01-19 11:17:56

标签: c++ smart-pointers

我有一个shared_ptr指向动态分配的char s内存缓冲区。我打电话给shared_ptr OwnerSharedPointer

现在,如果我宣布:

char * borrowerPtr;

并执行此操作:

borrowerPtr = OwnerSharedPointer.get();

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

2 个答案:

答案 0 :(得分:2)

取决于。

如果borrowerPtr仅在OwnerSharedPointer的生命周期内使用,则可以。指针对象仍然活得很好。

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

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

答案 1 :(得分:2)

  

这有什么问题吗?

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

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