【发布时间】:2011-07-04 15:45:04
【问题描述】:
我正在做类似这个项目Correct BOOST_FOREACH usage?
但是,我返回的列表包含在 boost::shared_ptr 中。如果我没有在 BOOST_FOREACH 循环之前将列表分配给变量,我会在运行时崩溃,因为列表正在被破坏,因为它是一个临时的。
boost::shared_ptr< list<int> > GetList()
{
boost::shared_ptr< list<int> > myList( new list<int>() );
myList->push_back( 3 );
myList->push_back( 4 );
return myList;
}
那以后..
// Works if I comment out the next line and iterate over myList instead
// boost::shared_ptr< list<int> > myList = GetList();
BOOST_FOREACH( int i, *GetList() ) // Otherwise crashes here
{
cout << i << endl;
}
我希望能够使用上述内容而不必引入变量“myList”。 这可能吗?
【问题讨论】:
-
它是如何崩溃的?有任何断言失败吗?还是别的什么?
-
BOOSTFOREACH.exe 中 0x00426692 处未处理的异常:0xC0000005:访问冲突读取位置 0xfeeefeee。
-
我假设崩溃是因为 list
已被销毁(我通过析构函数进行了跟踪),但 BOOST_FOREACH 在尝试调用 list ::begin() 时出错跨度> -
您正在取消对 shared_ptr 的引用,但从未将其复制到新的 shared_ptr 中,因此引用计数将达到 0 并且将被销毁。如果您要尝试执行 auto list = GetList();在 BOOST_FOREACH( int i, *list ) 之前的行上,它应该修复该特定错误。
-
是的,看起来这是我最终需要做的事情。我开始使用 BOOST_FOREACH 来避免一开始就必须这样做。
标签: c++ boost shared-ptr temporaries boost-foreach