面对一个错误“*** glibc检测***免费():无效的下一个大小(快)”

请参阅MSO问题可能出现的重复列表 – C内存分配和溢出边界以获取有关密切相关问题的信息。


开发环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6

我运行一个Javatesting客户端,使用JNI加载一个C ++共享库。 我的应用程序中有三个组件,

  1. Java客户端
  2. C ++共享库,它充当一个JNI包装器。 (我会称之为“wrapperlibrary”)
  3. 包含业务对象的C ++共享库。 (我会称之为“businesslibrary”)

当我运行客户端时,我经常面对一个错误, *** glibc detected *** free(): invalid next size (fast): 0x080eeef8 *** 。 这个错误大约需要10到11次,然后运行应用程序。

在我的Java客户端中,我首先按如下方式在静态ctor中加载所需的C ++库,

 static { System.Load("/root/Desktop/libs/businesslibrary"); System.out.println("business library loaded"); System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); } 

“业务库加载”的语句被打印在控制台上,但之后错误*** glibc...来。

在包装库的项目设置中,业务库被指定为从属库。 所以,即使我省略了加载businesslibrary的调用,

 static { System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); } 

那么首先加载业务库(通过全局variables创build日志logging来看),然后加载包装库。 该控件返回到Java客户端,并在控制台上打印语句“包装库加载”。 之后有一个本地方法调用。 但是控件从来没有达到这个本地方法的实现。 而在此之前,错误*** glibc...再次来临。 另外,如果我在本地方法调用之前插入另一个Java类的静态方法的调用,

 static { System.Load("/root/Desktop/libs/wrapperlibrary"); System.out.println("wrapper library loaded"); System.out.println(Try.temp()); //where temp is a static method of Try class which returns a string. native method call; -- -- } 

那么Try.temp()的输出永远不会被打印。

在这两种方法中,可能的原因是什么?我应该如何进行?

可能是因为Java本身链接的是不同于你的库的glibc,或者这些库链接到了不同的/不同的glibcs​​。
还要检查一个库是否与glibc的debugging版本链接(在C ++运行库lib的窗口上解决这个问题)。 尝试静态链接您的库与glibc,或者为了排除将包装器和业务库静态链接到一个库中的可能性。

我几次遇到这个神秘的错误。

在每种情况下,都是由引用数组成员之外的数组成员引起的。 该参考没有导致分段错误,因为它仍然在程序中另一个数组的范围内。 然而,当我去释放数组时,事情已经搞砸了,导致这个错误。

解决的办法是非常仔细地检查每个数组是否正确分配,并且对数组成员的引用永远不会超出范围。