【发布时间】:2014-04-18 16:18:59
【问题描述】:
这是我第一次发帖,所以如果我搞砸了或者让任何事情变得更加困难,我深表歉意。
这是我的问题:
我正在尝试从boost::shared_ptr 节点的向量中删除数据,节点是一个类。
在我的代码的一部分中,从称为 openList 的向量中擦除一个元素可以正常工作。
在我的代码的另一部分中,从称为movingObjectsList 的向量中删除一个元素并不想工作。它用 _block_type_is_valid(phead-nblockuse) 提示我。
我尝试过clear()、popback() 和erase(),它们都导致了同样的问题。我可以将我喜欢的内容添加到movingObjectsList 而不会出现任何错误,并将它保存的数据与其他向量交换,但我无法删除任何数据。
我想我已经排除了它是节点析构函数的问题,因为当我使用 Ints 而不是节点时我遇到了同样的问题,而且 openList 能够擦除元素。
这就是它在标题中的声明方式。
vector<boost::shared_ptr <node>> movingObjectsList;
这是cpp中的相关代码
grid::grid()
{
movingObjectsList = vector<boost::shared_ptr<node>>();
}
void grid::createGrid(){
boost::shared_ptr<node> movingObject = boost::shared_ptr<node> (&nodes[8][8]);
movingObjectsList.push_back(movingObject);
}
void grid::movingObjects()
{
movingObjectsList.erase(movingObjectsList.begin());
}
这是我将其简化为最简单的形式,仅涉及movingObjectsList。 如果没有擦除功能,它可以正常工作。
【问题讨论】:
-
什么是
nodes?您知道如果shared_ptr的引用计数器达到零,则包含的指针将被删除? -
哎呀,对不起。节点节点[高度][宽度];这是我的二维节点数组
-
考虑改用
std::shared_pointer,也看看auto。感谢您的未定义行为被删除的调试断言捕获。 -
您的节点阵列有多大?常数
height和width是 8 或更小吗?在那种情况下,你甚至在 shared_pointer 参与之前就有了 UB。 -
感谢大家的帮助和解释:)
标签: c++ vector shared-ptr erase