shared_ptr在超出范围时抛出断言

ang*_*iac 1 c++ boost shared-ptr

好吧,我一直试图绕过这个问题一段时间了,但是我不明白,有人可以告诉我为什么案例#1会抛出一个断言(BLOCK TYPE IS INVALID)?

情况1

mehodName()
{
    // Get all dependents for this resource
    boost::shared_ptr<std::set<std::string>> dependents = deactivatedResource->getDependendents();
    // Do some stuff 
} // Assertion thrown here (heap gets corrupted)
Run Code Online (Sandbox Code Playgroud)

这是这种情况下的getDependents:

boost::shared_ptr<std::set<std::string>> Resource::getDependendents()
{
    return boost::shared_ptr<std::set<std::string>>(&dependents);
}
Run Code Online (Sandbox Code Playgroud)

案例#2

mehodName()
{
// Get all dependents for this resource
std::set<std::string>* dependents = deactivatedResource->getDependendents();
} // No problem !! (but an obvious leak , if I try to use delete ,then the same assertion as in case 1)
Run Code Online (Sandbox Code Playgroud)

这是这种情况下的getDependents:

   std::set<std::string>* Resource::getDependendents()
   {
    return &dependents;
   }
Run Code Online (Sandbox Code Playgroud)

对于这两种情况:

std::set<std::string> dependents;
Run Code Online (Sandbox Code Playgroud)

Kon*_*lph 6

shared_ptr管理资源所有权.当你传递一个指针时,你实际上是在说"这是你的.当你超出范围时,请务必将其丢弃." 1

但是然后你传递一个指针,该指针必须不被处理,因为它指向具有自动存储的对象.这不起作用.仅用于使用shared_ptr已创建的指针new.2

因此,shared_ptr正在尝试delete使用尚未new编辑的资源.这会导致您观察到的错误.


1这是一种简化.实际上,shared_ptr管理共享所有权(=与其他shared_ptr实例共享); 这意味着只有在所有拥有shared_ptr者超出范围后才会处置资源.

2还有一个简化:除了new获取需要管理的资源之外,还有其他方法,但是您需要告诉shared_ptr 如何管理资源.默认的处理操作是delete,仅适用于newed资源.