提升ptr_list中的shared_ptr

Boost shared_ptr in ptr_list

本文关键字:ptr shared 中的 list 提升      更新时间:2023-10-16

我是C++的新手,很快就开始使用boost库,因为它提供了我需要的很多功能。特别是BOOST_FOREACH对我来说非常有用,所以我可以很容易地迭代通过提升ptr_list。最终,我需要使用另一个库,它使用boosts 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::是我需要的库的名称空间
  • nddlgen::types::ModelList是来自boost::ptr_list<sdf::ElementPtr>typedef
  • sdf::ElementPtr是来自boost::shared_ptr<sdf::Element>typedef

问题:

这里显示的代码编译时没有错误或警告,但当我运行编译后的程序时,我会得到以下输出:*** Error in './nddl-generator-cli': double free or corruption (out): 0x00007ffd0ff46460 ***

我尝试过的:

我试图从sdf:ElementPtr中检索sdf::Element,并相应地更改了其他代码,但它不起作用。我会得到一些编译器错误。无论如何,我不想忽略建议使用sdf::ElementPtr的库。

后来,我尝试删除push_back函数参数中的&,但这当然不会编译,因为push_back函数需要一个指针。

此外,我不想没有boost的BOOST_FOREACH,所以我也不想使用任何其他类型的列表。

提升ptr_list怎么可能与提升shared_ptr不起作用?我可以做些什么来使用sdf::ElementPtrBOOST_FOREACH

[编辑]解决方案:

查看已接受的答案,尤其是评论。诀窍是使用std::list而不是增强ptr_list,因为BOOST_FOREACH也接受这些。

非常奇怪的是,您已经将shared_ptr用于currentModelElement,但却将该shared_ptr的地址放在ptr_list中。您应该将shared_ptr放在一个普通的list中。

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

Boost Pointer Containers显式拥有它们的元素。因此,不可能有共同的所有权。

只需存储

  • 容器中的共享指针(shared_ptr<T>((如果容器应使元素保持活动(
  • 容器中的弱指针(weak_pointer<T>((如果容器应该能够检测过时元素(
  • 原始指针(T*(,如果您知道元素的寿命总是比容器长