提升ptr_list中的shared_ptr
Boost shared_ptr in ptr_list
我是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(¤tModelElement);
// 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::ElementPtr
和BOOST_FOREACH
?
[编辑]解决方案:
查看已接受的答案,尤其是评论。诀窍是使用std::list
而不是增强ptr_list
,因为BOOST_FOREACH
也接受这些。
非常奇怪的是,您已经将shared_ptr
用于currentModelElement
,但却将该shared_ptr
的地址放在ptr_list中。您应该将shared_ptr
放在一个普通的list
中。
当你把¤tModelElement
放在ptr_list
中时,ptr_list
中的所有元素实际上都是相同的。它们都指向一个局部变量shared_ptr
的地址,当调用ptr_list'析构函数时,同一个shared_ptr指针会被多次删除。
Boost Pointer Containers显式拥有它们的元素。因此,不可能有共同的所有权。
只需存储
- 容器中的共享指针(
shared_ptr<T>
((如果容器应使元素保持活动( - 容器中的弱指针(
weak_pointer<T>
((如果容器应该能够检测过时元素( - 原始指针(
T*
(,如果您知道元素的寿命总是比容器长
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为共享 ptr 向量实现复制 c'tor?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 如何将派生类从基 ptr 分配给 nlohmann::json
- 引用 std::shared:ptr 以避免引用计数
- 为什么我不能在不进行任何转换的情况下将浮点数放入任何类型的 ptr 中?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 另一种类型的智能ptr,比如具有弱refs的unique_ptr
- 尝试打印出 *ptr++ 的值,以了解它是如何工作的
- 如何控制共享 ptr 引用计数?
- dopen():不以 root 身份运行时"failed to map segment from shared object"
- C++中的指针否定 (!ptr == NULL)
- 从const ptr*转换为ptr*时出现问题
- 无法使用 libtool 将 -shared 参数传递给 g++
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- shared-ptr-C++shared_ptr与unique_ptr用于资源管理