【问题标题】:_block_type_is_valid(phead- nblockuse) when erasing data from a vector of shared_ptr_block_type_is_valid(phead- nblockuse) 从 shared_ptr 的向量中擦除数据时
【发布时间】: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。感谢您的未定义行为被删除的调试断言捕获。
  • 您的节点阵列有多大?常数 heightwidth 是 8 或更小吗?在那种情况下,你甚至在 shared_pointer 参与之前就有了 UB。
  • 感谢大家的帮助和解释:)

标签: c++ vector shared-ptr erase


【解决方案1】:

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

【讨论】:

  • 我很抱歉,我不完全理解。如果我在向量中插入更多节点并且只删除其中一个节点,我会得到同样的错误,在这种情况下,包含的指针是否仍会达到零?
  • 如果您使用原始指针创建新的 shared_pointer,它不知道您已经拥有的任何其他 shared_pointer,这是一个错误。
  • @RagedMilkMan 是的,因为您创建了不同的共享指针。如果你让它们都指向同一个东西,那就更糟了。
【解决方案2】:

好的,共享指针的作用有误。

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

您将节点初始化为node [8][]。你的指针是这个二维数组中的一个地址!当您需要调用 delete 时(当您的 shared_ptr 超出范围时,即每当您从向量中删除元素时,就会调用它),您实际上是在调用 delete nodes[i][j],您希望它会出错。

在这种情况下只需使用引用(Node&),这将是完全有效的并且可以正常工作。

【讨论】:

    猜你喜欢
    • 2012-08-20
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2014-07-31
    相关资源
    最近更新 更多