【问题标题】:C++ : Double free or corruption (out)C++:双重释放或损坏(出)
【发布时间】:2015-12-24 13:39:54
【问题描述】:

我收到了这个错误

*** Error in `./main': double free or corruption (out): 0x000000000095c8a0 ***
  • getPieces() 定义为 vector<Piece*> Position::getPieces()
  • getSymbol() 返回 int

我想要实现的是从向量中删除与变量Pointer* piece 相同的Piece 指针。

int Position::removePiece(Piece* piece) {
  for (size_t i = 0; i < getPieces().size(); i++) {
    if (getPieces()[i] == piece) {
      getPieces().erase(getPieces().begin() + i); // errors happens here
      std::cout << getPieces().size() << std::endl;
      return getSymbol();
    }
  }

  return -1;
}

【问题讨论】:

  • 您使用的是什么编译器和操作系统版本?
  • @itsols Archlinux 和 g++
  • @KerrekSB 不,OP 在这里只使用一次迭代器。问题是,一个向量的迭代器用于修改另一个向量(可以预见的是失败)。
  • @Abstraction:好的,很公平。您最终仍会跳过元素,这可能会导致不良行为。

标签: c++ memory segmentation-fault


【解决方案1】:

正如所写,getPieces() 返回一个向量的副本。每次拨打getPieces(),都是不同的副本。您尝试使用来自另一个向量的迭代器从一个向量中删除元素,难怪会出现问题。无论如何,您尝试修改一个副本,该副本将在您离开函数时(甚至更早)被销毁。

如果getPiecesPosition 返回内部字段副本的方法(例如m_vector),请在removePiece() 中使用m_vector 而不是getPieces 调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多