容器问题:***检测到glibc *** free():无效指针:0x41e0ce94 ***

时间:2009-04-15 14:20:28

标签: c++ glibc

我在Linux上有一个C ++程序,经过一段时间后会崩溃:

*** glibc detected *** free(): invalid pointer: 0x41e0ce94 ***

在程序内部,我广泛使用容器。他们必须存储一个简单类的对象。

编辑 2009-4-17:

与此同时,似乎很清楚错误与简单类无关。如果我更改容器以保存其他数据类型,则仍会发生错误。问题必须在我的代码中的其他地方,我正试图弄清楚...

5 个答案:

答案 0 :(得分:4)

考虑使用std :: string来保存字符串值而不是原始字符指针。然后,您不必担心在赋值,复制和销毁方法中管理字符串数据。很可能你的问题就在那里。

编辑:您发布的新类没有问题,如果您只使用char *指向字符串常量,则第一个版本没有问题。问题出在程序的其他地方或者您使用该类的方式。您将不得不花费更多时间在调试器和/或valgrind中挖掘以追踪问题。我会弄清楚在指定的地址指向什么,并尝试确定它被释放两次的原因。

答案 1 :(得分:3)

猜测,你的拷贝ctor,赋值操作或析构函数有问题 - 你需要显示那些代码。

修改:注意到你没有赋值操作符 - 假设你的拷贝构造函数&析构函数没问题,你也需要一个赋值运算符,如std:;容器将使用它。

答案 2 :(得分:1)

我一直在与我们正在开发的C / C ++应用程序进行斗争,而我想到的第一个想法是

  • 指针已被修改,并指向无效的可能(ptr ++;)或类似的东西。
  • 您已释放对象,但指针仍然保持方向。

    Valgrind这样的工具可以帮助您检测代码中可能存在的错误。要安装:

    sudo apt-get install valgrind

    使用它:

    valgrind --tool = memcheck --leak-check = full ...

    它将在程序运行时报告错误,并在程序结束后为您提供报告。唯一的问题是valgrind认为可能的问题可能不是一个真正的问题。但这是一个起点。

答案 3 :(得分:1)

这肯定是一个糟糕的字符串值。如果它是一个悬空指针问题,使用std :: string可能会有所帮助。还要确保所有字符串初始化按预期工作。

如果我正确地理解了这个类,你会假设m_cstring中的内存不会在类的生命周期内被释放。在您的情况下,这也意味着容器的使用寿命。检查你的范围。

您可能遇到的另一个问题是,如果您的析构函数 删除了cstring,那么在构造函数中使用默认值是一个非常糟糕的主意,因为您将尝试释放静态分配的cstring。 / p>

在C ++中可以定义一个应该返回一个字符串的函数,但不会返回任何内容,并且你会收到一个错误的字符串(通常编译器将捕获'非虚函数的'到达结束' ,但并非总是如此。

同样使用valgrind。

作为阅读各种评论后的附录,程序中其他地方的内存错误总是有可能损坏其中一个字符串。

编辑 4-16

此时我将验证对象的值是否在构造/破坏上形成良好。 (尝试打印它们?)如果一切看起来都很好,您可能需要在代码中查找错误。

答案 4 :(得分:0)

你的析构函数里面有什么?可能它没有cstring。如果是这种情况,那么你在实例上共享你的cstring指针,然后每个实例释放相同的指针。