如果C / C ++ API从内部使用的shared_ptr返回原始指针,然后shared_ptr被“删除”,会发生什么?原始指针是否仍然有效? API开发人员如何在不再控制原始指针时清理原始指针?
例如:
MyClass* thisReturnsAPtr()
{
std::shared_ptr<MyClass> aSharedPtr = std::make_shared<MyClass>(MyClass);
return aSharedPtr.get();
}
答案 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?