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)
shared_ptr管理资源所有权.当你传递一个指针时,你实际上是在说"这是你的.当你超出范围时,请务必将其丢弃." 1
但是然后你传递一个指针,该指针必须不被处理,因为它指向具有自动存储的对象.这不起作用.仅用于使用shared_ptr已创建的指针new.2
因此,shared_ptr正在尝试delete使用尚未new编辑的资源.这会导致您观察到的错误.
1这是一种简化.实际上,shared_ptr管理共享所有权(=与其他shared_ptr实例共享); 这意味着只有在所有拥有shared_ptr者超出范围后才会处置资源.
2还有一个简化:除了new获取需要管理的资源之外,还有其他方法,但是您需要告诉shared_ptr 如何管理资源.默认的处理操作是delete,仅适用于newed资源.