gpt4 book ai didi

c++ - shared_ptr 在超出范围时抛出断言

转载 作者:太空宇宙 更新时间:2023-11-03 10:33:24 25 4
gpt4 key购买 nike

好的,一段时间以来我一直在努力解决这个问题,但我不明白有人能告诉我为什么 case#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)

这里是 getDependents 在这种情况下:

boost::shared_ptr<std::set<std::string>> Resource::getDependendents()
{
return boost::shared_ptr<std::set<std::string>>(&dependents);
}

案例#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)

这里是 getDependents 在这种情况下:

   std::set<std::string>* Resource::getDependendents()
{
return &dependents;
}

对于这两种情况:

std::set<std::string> dependents;

最佳答案

shared_ptr 管理资源所有权。当你向它传递一个指针时,你实际上是在说“这是你的。确保在超出范围时将其处理掉。”1

但是随后您向它传递了一个不能被释放的指针,因为它指向一个具有自动存储的对象。这是行不通的。仅对使用 new 创建的指针使用 shared_ptr2

因此,shared_ptr 正在尝试删除 尚未新建的资源。这会导致您观察到错误。


1 这是一种简化。实际上,shared_ptr 管理共享 所有权(= 与其他shared_ptr 实例共享);这意味着只有当 all 拥有 shared_ptr 的资源超出范围时,才会处理该资源。

2 也是一个简化:除了new还有其他方式获取需要管理的资源,但是这时候需要告诉shared_ptr 如何管理资源。默认处理操作是删除,它只适用于ed 资源。

关于c++ - shared_ptr 在超出范围时抛出断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com