我是C ++的新手并且很快就开始使用boost库,因为它提供了我需要的许多功能。特别是BOOST_FOREACH
对我非常有用,所以我可以很容易地迭代一下ptr_list
。最终我需要使用另一个库,它使用boost shared_ptr
。
这是我的代码:
bool SdfParser::parseDataStructure(sdf::ElementPtr sdfRoot)
{
/* sdfRoot is the root of a xml-like data structure. The first child is "world" and the childs of "world" are several "model" elements */
nddlgen::models::Workspace* workspace = new nddlgen::models::Workspace();
workspace->setName("workspace");
this->_armModel->setWorkspace(workspace);
sdf::ElementPtr workspaceElement = sdfRoot->GetElement("world");
sdf::ElementPtr currentModelElement = workspaceElement->GetElement("model");
nddlgen::types::ModelList models;
// The sdf lib only offers a useless data structure for the models, so it is
// converted into a ModelList here
while (currentModelElement != nullptr)
{
models.push_back(¤tModelElement);
// Iterate
currentModelElement = currentModelElement->GetNextElement("model");
}
if (!this->instantiateModels(models))
{
return false;
}
if (!this->calculateDependencies(models))
{
return false;
}
return true;
}
说明:
nddlgen::
是我作品的名称空间sdf::
是我需要的lib的命名空间nddlgen::types::ModelList
是来自typedef
boost::ptr_list<sdf::ElementPtr>
sdf::ElementPtr
是来自typedef
boost::shared_ptr<sdf::Element>
问题:
此处显示的代码编译时没有错误或警告,但是当我运行已编译的程序时,我得到以下输出:*** Error in './nddl-generator-cli': double free or corruption (out): 0x00007ffd0ff46460 ***
。
我尝试了什么:
我尝试从sdf::Element
检索sdf:ElementPtr
并相应地更改了其他代码,但它不起作用。我会得到一些编译器错误。无论如何,我不想忽视建议使用sdf::ElementPtr
的库。
后来我尝试删除&
函数的参数中的push_back
,但当然,这不会编译,因为push_back
函数需要一个指针。
此外,我不想没有提升BOOST_FOREACH
,所以我也不想使用任何其他类型的列表。
如果提升ptr_list
不能与提升shared_ptr
一起使用,怎么可能?如何使用sdf::ElementPtr
以及BOOST_FOREACH
?
[编辑]解决方案:
查看已接受的答案,尤其是评论。诀窍是使用std::list
而不是提升ptr_list
,因为BOOST_FOREACH
也接受这些。{/ p>
答案 0 :(得分:1)
您已经将shared_ptr
用于currentModelElement
并将shared_ptr
的地址放在ptr_list中,这很奇怪。您应该将shared_ptr
置于普通list
。
当您将¤tModelElement
放入ptr_list
时,ptr_list
中的所有元素实际上都是相同的。它们都指向一个局部变量的地址shared_ptr
,当调用ptr_list'析构函数时,多次删除相同的shared_ptr指针。
答案 1 :(得分:1)
提升指针容器显式拥有其元素。因此,不能共享所有权。
只需存储
shared_ptr<T>
)(如果容器应该保持元素处于活动状态)weak_pointer<T>
)(如果容器应该能够检测陈旧元素)T*
),如果您知道元素的持续时间将长于容器。