如果原始指针被删除shared_ptr,会发生什么情况?



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

举个例子:

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

如果周围不再有其他shared_ptr仍然保存对该对象的引用,从而使该对象保持活动状态,则该对象将被销毁,内存将被释放,并且指向该对象的任何仍然存在的指针都将变成悬空指针。

在上面的示例中,函数 thisReturnsAPtr 返回的指针保证是无效指针......

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

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

这就提出了你的问题"如果我新建一个类并删除它,然后返回原始指针会发生什么"。这更容易回答,答案是"坏"。关于堆栈溢出的这个问题有很多答案 - 例如C++删除 - 它会删除我的对象,但我仍然可以访问数据?

"如果原始指针被删除shared_ptr,它会怎样?"- 什么都没有。随后使用该指针只是变得无效。

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

不。然后使用原始指针是无效的。并且原始指针不会更改(到 nullptr (以指示指向的对象已被删除。

有责任确保,如果发生类似情况,则在原始指针失效后不要使用原始指针。你如何做到这一点取决于你 - 语言不关心/帮助你。

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

相关内容