在ptr_list

时间:2015-07-18 13:33:39

标签: c++ boost

我是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(&currentModelElement);

        // 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>

2 个答案:

答案 0 :(得分:1)

您已经将shared_ptr用于currentModelElement并将shared_ptr的地址放在ptr_list中,这很奇怪。您应该将shared_ptr置于普通list

当您将&currentModelElement放入ptr_list时,ptr_list中的所有元素实际上都是相同的。它们都指向一个局部变量的地址shared_ptr,当调用ptr_list'析构函数时,多次删除相同的shared_ptr指针。

答案 1 :(得分:1)

提升指针容器显式拥有其元素。因此,不能共享所有权。

只需存储

  • 容器中的共享指针(shared_ptr<T>)(如果容器应该保持元素处于活动状态)
  • 容器中的弱指针(weak_pointer<T>)(如果容器应该能够检测陈旧元素)
  • 原始指针(T*),如果您知道元素的持续时间将长于容器。