【问题标题】:Segmentation fault - std::_Rb_tree分段错误 - std::_Rb_tree
【发布时间】:2012-02-10 22:57:53
【问题描述】:

我的应用程序发生了一些崩溃,想知道是否有人可以提供帮助。

gdb:

http://pastebin.com/tW6HzY2Y 什么会导致这种情况?我正在使用 Ubuntu 10.04.3。

编辑: 看起来问题就在这里:

bool ChatChannel::removeUser(Player* player)
{
    UsersMap::iterator it = m_users.find(player->getID());
    if(it == m_users.end())
        return false;

    m_users.erase(it);

    return true;
}

这很奇怪,这部分从来没有任何问题。我不知道如何重现错误。

【问题讨论】:

  • 那……信息太少了,无法使用。
  • 问题是您的代码中存在错误。但是不可能建议那可能是什么,因为您没有显示任何代码。请考虑创建minimal test-case
  • 你能举个例子说明什么可能导致这种情况吗?我不能给出代码我不知道问题出在哪里。
  • 它几乎可以是任何东西。在某个地方,您破坏了容器的内部状态,或者您传递了一些无效的参数,或者您以其他方式调用了未定义的行为。我建议最小化代码,或者在例如下运行。 Valgrind,或启用检查容器。
  • 如果您使用的是应该排序的集合,那么请确保比较函数是正确的。只是一个提示

标签: c++ gdb segmentation-fault


【解决方案1】:

不知道指向 Player 的指针何时/何地被初始化/丢弃。我会非常仔细地看它。大多数时候,原始指针都是令人头疼的问题。 请看player->getID()。可能对成员函数的调用是在无效的内存地址上完成的。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

正如其他人所建议的那样,没有什么可做的。您链接到的堆栈跟踪几乎没有信息。但是,有一点可以肯定地说:基于this=0x38,您正试图在不是树的对象中找到某些东西。我个人的猜测是,包含std::map<unsigned int, Player> 的数据结构在其他几个成员(总大小为 56 字节)之后具有此映射,但您尝试通过NULL 指针访问此数据结构。也就是说,尽管在std::_Rb_tree 中发生了分段错误,但std::map 实现中根本没有错误。

【讨论】:

    【解决方案3】:

    valgrind 下运行您的程序。它几乎肯定会在实际崩溃之前吐出一些错误,这可能更接近错误的根源(而不是附带损害)。

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多