小编HS.*_*HS.的帖子

面对错误"***glibc detect***free():无效下一个尺寸(快)"

请参阅MSO问题可能重复的长列表 - C内存分配和超限界限,以获取有关密切相关问题的信息.


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

我运行一个Java测试客户端,使用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");
}
Run Code Online (Sandbox Code Playgroud)

"业务库已加载"语句将打印在控制台上,但之后会出现错误*** glibc....

在wrapperlibrary的项目设置中,businesslibrary被指定为依赖库.所以,即使我省略了加载businesslibrary并且只是写的调用,

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

然后首先加载businesslibrary(通过全局变量创建日志记录看到),然后加载wrapperlibrary.控件返回到java客户端,并在控制台上打印语句"wrapper library loaded".在此之后,调用本机方法.但控件永远不会达到这种本机方法的实现.而在此之前,错误*** 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;

 -- …
Run Code Online (Sandbox Code Playgroud)

linux java-native-interface centos

12
推荐指数
1
解决办法
2万
查看次数

具有C链接的函数能够返回类类型吗?

我在dll中观察到一个具有C连接的函数.此函数返回类类型.我不确定这是如何实现的,因为C不理解课程.
我自己编写了一个示例dll和程序,并注意到VC++编译器显示了对此效果的警告,但并未阻止您.该程序能够使用此函数的GetProcAddress并调用它来接收返回的对象.类定义可供程序使用.
此外,如果我编写一个带有C链接的函数,该函数返回甚至不导出此类的类类型,则编译器不会发出任何警告.如果类定义可用,程序可以从dll使用此函数.
有关这是如何工作的任何想法?这样的行为编译器/平台是否具体?

c++ visual-c++

5
推荐指数
2
解决办法
4072
查看次数

在C++中是否有任何堆压缩?

我有一个概念,即C++运行时不执行任何堆压缩,这意味着在堆上创建的对象的地址永远不会更改.我想确认这是否属实,以及是否适用于每个平台(Win32,Mac,......)?

c++ heap

3
推荐指数
1
解决办法
2254
查看次数

标签 统计

c++ ×2

centos ×1

heap ×1

java-native-interface ×1

linux ×1

visual-c++ ×1