我在以下代码中收到无效的内存错误:
printf(" %s\n","FINE 5");
printf("%s LENGTH IS: %d\n","FINE 6",strlen(": "));
buffer = (char *)realloc(buffer, strlen(buffer)* sizeof(char) + (strlen(": ")+1)* sizeof(char));
printf(" %s\n","FINE 7");
strcat(buffer, ": \0");
Run Code Online (Sandbox Code Playgroud)
输出:
FINE 5
FINE 6 LENGTH IS:
检测到 2 *glibc* ./auto:realloc():下一个大小无效:0x08cd72e0***======= Backtrace:=========/lib/tls /i686/cmov/libc.so.6(+0x6b591)[0x6dd591]
这里需要注意的Fine 7是从未打印过.每次运行时无效的下一个大小错误位于同一位置.
发现这种相关性
请参阅MSO问题可能重复的长列表 - C内存分配和超限界限,以获取有关密切相关问题的信息.
开发人员环境:CentOS 4.7,Kdevelop 3.1.1,gcc 3.4.6
我运行一个Java测试客户端,使用JNI加载C++共享库.我的应用程序有三个组件,
当我运行客户端时,我经常遇到错误,即*** 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) 我遇到过所谓的神秘realloc invalid next size error,我gcc在linux我的代码上使用的是
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i;
char *buf;
char loc[120];
buf = malloc(1);
int size;
for(i=0;i<1920;i++)
{
sprintf(loc,"{Fill_next_token = my_next_token%d; Fill_next_token_id = my_next_token_id = my_next_token_id%d}",i,i);
size = strlen(buf)+strlen(loc);
printf("----%d\n",size);
if(!realloc(buf,size))
exit(1);
strcat(buf,loc);
}
}
Run Code Online (Sandbox Code Playgroud)
(我的可能是重复的问题)这里解决方案的某个地方是避免strcat和使用memcpy,但在我的情况下,我真的想连接字符串.上面的代码适用于这样的920次迭代,但是在1920的情况下realloc给出了无效的新大小错误.请帮助找到连接的替代方案,期待对像我这样的懒惰程序员来说是一个有用的问题.