我在Linux上有一个C ++程序,经过一段时间后会崩溃:
*** glibc detected *** free(): invalid pointer: 0x41e0ce94 ***
在程序内部,我广泛使用容器。他们必须存储一个简单类的对象。
编辑 2009-4-17:
与此同时,似乎很清楚错误与简单类无关。如果我更改容器以保存其他数据类型,则仍会发生错误。问题必须在我的代码中的其他地方,我正试图弄清楚...
答案 0 :(得分:4)
考虑使用std :: string来保存字符串值而不是原始字符指针。然后,您不必担心在赋值,复制和销毁方法中管理字符串数据。很可能你的问题就在那里。
编辑:您发布的新类没有问题,如果您只使用char *指向字符串常量,则第一个版本没有问题。问题出在程序的其他地方或者您使用该类的方式。您将不得不花费更多时间在调试器和/或valgrind中挖掘以追踪问题。我会弄清楚在指定的地址指向什么,并尝试确定它被释放两次的原因。
答案 1 :(得分:3)
猜测,你的拷贝ctor,赋值操作或析构函数有问题 - 你需要显示那些代码。
修改:注意到你没有赋值操作符 - 假设你的拷贝构造函数&析构函数没问题,你也需要一个赋值运算符,如std:;容器将使用它。
答案 2 :(得分:1)
我一直在与我们正在开发的C / C ++应用程序进行斗争,而我想到的第一个想法是
您已释放对象,但指针仍然保持方向。
像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指针,然后每个实例释放相同的指针。