如果删除了shared_ptr,原始指针会怎样?

时间:2019-04-05 15:26:36

标签: c++

如果C / C ++ API从内部使用的shared_ptr返回原始指针,然后shared_ptr被“删除”,会发生什么?原始指针是否仍然有效? API开发人员如何在不再控制原始指针时清理原始指针?

例如:

MyClass* thisReturnsAPtr()
{
    std::shared_ptr<MyClass> aSharedPtr = std::make_shared<MyClass>(MyClass);
    return aSharedPtr.get();
}

3 个答案:

答案 0 :(得分:3)

如果周围没有其他shared_ptr仍然保留着对该对象的引用,从而使该对象保持活动状态,则该对象将被破坏,内存释放,并且任何仍然存在的指针指向该对象的名称将变成dangling pointer

在上面的示例中,由函数thisReturnsAPtr返回的指针肯定是无效的指针...

答案 1 :(得分:1)

“如果删除了shared_ptr,原始指针会发生什么?” - 没有。后来使用该指针变得无效。

“ C / C ++ API从内部使用的shared_ptr返回原始指针,然后shared_ptr被“删除”?原始指针仍然有效吗?”

不。然后使用原始指针是无效的。并且原始指针不会发生变化(变为nullptr)以指示指向的对象已被删除。

您有责任确保,如果发生类似的情况,则在原始指针无效后,请勿使用该原始指针。您的操作方式取决于您-语言无关紧要/对您没有帮助。

在指向它的对象已删除之后使用原始指针是未定义行为。

答案 2 :(得分:1)

将智能指针视为延迟删除机制有时可能有用。我的意思是,如果您分配一个类并将其提供给智能指针,则基本上是在要求智能指针类在将来某个时候删除该指针。对于shared_ptr,将来的时间是不再有shared_ptr的时间。

将此应用于您的代码,即可创建一个shared_ptr。然后,您返回原始指针。然后函数结束,指向该指针的唯一shared_ptr被销毁,因此基础类被删除。

这将引起您的问题“如果我新建一个班级并删除它,然后返回原始指针,将会发生什么”。这很容易回答,答案是“坏”。堆栈溢出时,此问题有很多答案-例如C++ delete - It deletes my objects but I can still access the data?