C++ _当从共享\u ptr的向量中擦除数据时,块类型\u是有效的(phead-nblockuse)

C++ _当从共享\u ptr的向量中擦除数据时,块类型\u是有效的(phead-nblockuse),c++,vector,shared-ptr,erase,C++,Vector,Shared Ptr,Erase,这是我第一次发帖,所以如果我把事情搞砸了,或者让事情变得更困难,我向你道歉 这是我的问题: 我试图从boost::shared_ptr节点向量中删除数据,节点是一个类。 在我的代码的一部分中,从名为openList的向量中删除元素效果很好。 在我代码的另一部分中,从称为movingObjectsList的向量中删除一个元素是行不通的。它会提示我_block_type_is valid(phead-nblockuse) 我尝试了clear()、popback()和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());
}  
grid::grid()
{
MovingObject列表=向量();
}
void grid::createGrid(){
boost::shared_ptr movingObject=boost::shared_ptr(&nodes[8][8]);
移动对象列表。向后推(移动对象);
}
void grid::movingObjects()
{
movingObjectsList.erase(movingObjectsList.begin());
}  
这是我把它简化为的最简单的形式,只涉及移动对象列表。
如果没有擦除功能,它可以正常工作。

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

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

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

您正在将节点初始化为
节点[8][
。您的指针是此2D数组中的地址!当您需要调用delete时(当您的共享\u ptr超出范围时,即当您从向量中删除元素时,将调用delete),您实际上是在调用
delete nodes[i][j]
,您可能会对其进行呕吐


在本例中只需使用引用(Node&),它将完全有效,并且工作正常。

什么是
节点
?您知道,如果
共享\u ptr
的引用计数器达到零,则包含的指针将被删除?哦,对不起。节点[高度][宽度];这是我使用
std::shared_pointer
的2d nodesConsider数组,请看一下
auto
。感谢您的未定义行为被delete的调试断言捕获。您的节点数组有多大?常量
高度
宽度
是否碰巧为8或更小?在这种情况下,甚至在共享指针介入之前,您就已经有了UB。谢谢大家的帮助和解释:)对不起,我不完全理解。如果我在向量中插入更多节点并只删除其中一个节点,则会出现同样的错误。在这种情况下,包含的指针是否仍然会达到零?如果使用原始指针创建新的共享指针,它不知道您已经拥有的任何其他共享指针,这是一个错误。@RagedMilkMan Yes,当您创建不同的共享指针时。如果你让他们都指向同一件事,那就更糟了。