2009-04-15 70 views
1

我有Linux上的C++程序一些时间与该消息之后崩溃:问题容器:*** glibc的检测***免费():无效指针:0x41e0ce94 ***

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

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

编辑 2009-4-17:

同时似乎很明显的错误无关,与简单的类。如果我将容器更改为容纳其他数据类型,仍然会出现此错误。这个问题必须在其他地方在我的代码,我试图弄明白此刻...

感谢大家谁对我的问题作出了贡献,到目前为止,它是有益的和有启发呢。

+0

很高兴看到使用这个类的代码。 – 2009-04-15 15:07:53

回答

4

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

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

3

在猜测,有什么不对您的拷贝构造函数,赋值运算或析构函数 - 你需要显示这些代码。

编辑:只注意到你没有赋值运算符 - 假设你的拷贝构造函数&析构函数OK,你需要一个赋值操作符也一样,性病:;容器将使用它。

+0

感谢您的回答。我现在用一个赋值操作符试了一下,但我不会帮忙。为什么默认赋值运算符不够用?我基本上使用析构函数和复制构造函数仅用于跟踪目的... – Chris 2009-04-15 14:52:45

+0

发布真正的完整代码 - 理想情况下是一个崩溃的简单示例。 – 2009-04-15 15:05:20

+0

默认的拷贝构造函数执行按位拷贝,所以你会有2个对象指向同一个字符串。这取决于你对字符串的管理是否是一个问题。 – 2009-04-15 17:07:47

0

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

+0

目前在析构函数中没有任何东西,我ipmlemented它只是为了追踪目的... – Chris 2009-04-15 14:54:34

1

我一直争取用C/C++应用程序,我们正在开发,并来我脑海的第一个想法是

  • 指针已被修改,它指向一个无效possition(PTR ++;)或类似的东西。
  • 您已经释放了对象,但指针仍占据方向。

    Valgrind的工具可以帮助你在代码中检测到可能的错误。要安装:

    命令和apt-get安装的valgrind

    ,并使用它:

    的valgrind --tool = MEMCHECK --leak检查=全...

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

1

这绝对是一个糟糕的字符串值。如果是悬挂指针问题,使用std :: string可能对此有所帮助。同时确保所有的字符串初始化按预期工作。

如果我正确理解该类,那么您认为m_cstring中驻留的任何内存都不会在该类的整个生命周期中解除分配。在你的情况下,这也意味着在容器的使用期限内。检查你的示波器。

,你可能会遇到的另一个问题是,如果你的析构函数删除的CString然后使用在构造函数中的默认值是一个非常糟糕的主意,因为你将试图解除分配静态分配的CString。

在C++中可以定义一个函数,该函数应该返回一个字符串,但不会返回任何东西,而且您会收到一个错误的字符串(通常编译器会捕获'非结束函数', 但不总是)。

同上使用valgrind。

作为阅读各种评论后的附录,程序中某处出现内存错误可能会损坏其中一个字符串。

EDIT 4-16

此时我将验证对象的值是公形成在构建体/自毁。 (尝试打印它们?)如果一切看起来不错,则可能需要查看代码中的其他地方以查找错误。

相关问题