[英]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(¤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
是來自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
。
而當你把¤tModelElement
在ptr_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.