簡體   English   中英

提高ptr_list中的shared_ptr

[英]Boost shared_ptr in ptr_list

我是C ++的新手,並迅速開始使用boost庫,因為它提供了我需要的許多功能。 特別是BOOST_FOREACH對我來說非常有用,因此我可以輕松地通過boost 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::是我需要的lib的名稱空間
  • 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 ,所以我也不想使用任何其他類型的列表。

boosts ptr_list不能與boosts shared_ptr怎么辦? 如何使用sdf::ElementPtr以及BOOST_FOREACH

[編輯]解決方案:

查看已接受的答案,尤其是評論。 訣竅是使用std::list而不是boosts ptr_list ,因為BOOST_FOREACH也接受那些。

非常奇怪的是,您已經對currentModelElement使用了shared_ptr ,但是將那個shared_ptr的地址放在了ptr_list中。 您應該將shared_ptr放在普通list

而當你把&currentModelElementptr_list ,在所有的元素ptr_list實際上是相同的。 它們都指向一個名為shared_ptr的局部變量的地址,當調用ptr_list的析構函數時,同一個shared_ptr指針將被刪除多次。

Boost指針容器明確擁有其元素。 因此,不能共享所有權。

只是存儲

  • 容器中的共享指針( shared_ptr<T> )(如果容器應使元素保持活動狀態)
  • 容器中的弱指針( weak_pointer<T> )(如果容器應該能夠檢測到過時的元素)
  • 原始指針( T* ),如果您知道元素的壽命永遠比容器長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM