从shared_ptr的向量中删除数据时_block_type_is_valid(phead-nblockuse)

时间:2014-04-18 16:18:59

标签: c++ vector shared-ptr erase

这是我的第一次发帖,所以如果我搞砸了或者做了比应该更困难的事情,我会道歉。

这是我的问题:
我试图从boost::shared_ptr个节点的矢量中删除数据,节点是一个类 在我的代码的一部分中,从称为openList的向量中擦除元素可以正常工作 在我的代码的另一部分中,从一个名为movingObjectsList的向量中删除一个元素,不想工作。它提示我_block_type_is_valid(phead-nblockuse)。

我已经尝试了clear()popback()erase(),所有这些都会导致同样的问题。我可以添加我喜欢的movingObjectsList没有任何错误,并将其保存的数据与其他向量交换,但我无法删除任何数据。

我认为我已经排除了节点析构函数的问题,因为当我使用Int而不是节点时我遇到了同样的问题,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。 没有擦除功能,它可以正常工作。

2 个答案:

答案 0 :(得分:2)

作为回答,我重申我在评论中所说的内容:当shared_ptr的引用计数器达到零时,包含的指针将被删除。这意味着它基本上与delete &nodes[8][8]相同。由于未使用new分配,您将体验undefined behavior

答案 1 :(得分:0)

好的,错误的是共享指针的作用。

共享指针获取指针的完全所有权。当该指针超出范围时,它将删除该指针。

您正在将节点作为node [8][]进行身份验证。你的指针是这个2D数组中的一个地址!当你需要调用delete时(当你的shared_ptr超出范围时会被调用,即每当你从向量中删除元素时),你实际上是在调用delete nodes[i][j],你期望这是barf。

在这种情况下使用引用(Node&amp;),这将完全有效并且工作得很好。