与realloc一起使用free

与realloc一起使用free,c,sockets,malloc,free,realloc,C,Sockets,Malloc,Free,Realloc,我试图使用realloc在从套接字读取时将内存同步分配给数组。。每个东西都工作得很好,但当我主要使用free时,它会出错。我实际上需要获取usr_数据中的数据,并将其发送到不同的函数进行处理 *** glibc detected *** free(): invalid next size (fast): 0x083fc008 *** Aborted (core dumped) 以下是函数: int read_from_socket(int connfd,char **usr_str) { pr

我试图使用realloc在从套接字读取时将内存同步分配给数组。。每个东西都工作得很好,但当我主要使用free时,它会出错。我实际上需要获取usr_数据中的数据,并将其发送到不同的函数进行处理

*** glibc detected *** free(): invalid next size (fast): 0x083fc008 ***
Aborted (core dumped)
以下是函数:

int read_from_socket(int connfd,char **usr_str)
{
printf("\nusr_data : %s\n",*usr_str);
int count = 0, bytesread = 0;
char *temp;
char buf[MAX] = {0};
while((bytesread = read(connfd,buf,BLOCKSIZE))>0)
{
    temp = NULL;
    count = count + bytesread;
    temp = (char *)realloc(*usr_str, count);
    if(NULL == temp)
    {
        printf("\nMemory Error\n");
        return FAILURE;
    }
    *usr_str = temp;
    printf("\nadd in: %lu",*usr_str);
    memcpy(((*usr_str) + count - bytesread),buf, MAX);
    printf("\nadd in2: %lu",*usr_str);
    if((*usr_str)[count-1] == '$')
    {
       (*usr_str)[count-1] = '\0';
       printf("\nData received: %s\n",*usr_str);
       printf("\nadd in2: %lu",*usr_str);
       break;
    }
}
}
这是我在main中使用的代码

for(;;)
{
printf("I am waiting-----Start of Main Loop\n");
len=sizeof(cliaddr);
connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
if ( connfd < 0)
{
    if (errno == EINTR)
    printf("Interrupted system call ??");
    continue;
}
printf("Connection from %s\n",inet_ntop(AF_INET,&cliaddr.sin_addr,buf,sizeof(buf)));
while(1)
{
    usr_data = NULL;
    read_from_socket(connfd,&usr_data);
    printf("\nusr_dat: %s    %lu\n",usr_data,usr_data);
    if(!strcmp(usr_data,"exit"))
    {
        break;
    }
    printf("\nadd: %lu\n",usr_data);
    free(usr_data);
}
close(connfd);
printf("\nFINISHED SERVING ONE CLIENT\n");
}
(;;)的

{
printf(“我正在等待------主循环的开始\n”);
len=sizeof(cliaddr);
connfd=accept(sd,(struct sockaddr*)和cliaddr,&len);
如果(connfd<0)
{
如果(errno==EINTR)
printf(“中断的系统调用”);
持续
}
printf(“来自%s\n的连接”,inet\u ntop(AF\u inet,&cliaddr.sin\u addr,buf,sizeof(buf));
而(1)
{
usr_数据=NULL;
从_插槽读取_(connfd和usr_数据);
printf(“\nusr\u数据:%s%lu\n”,usr\u数据,usr\u数据);
如果(!strcmp(usr_数据,“退出”))
{
打破
}
printf(“\nadd:%lu\n”,usr\U数据);
免费(usr_数据);
}
关闭(connfd);
printf(“\n已完成为一个客户端提供服务\n”);
}
实际上,服务器一直在读循环中运行,直到从用户那里退出


有人能指出原因吗。。glibc error with free()

在我看来,您已经在循环中使用了free()调用,一旦内存释放,必须重新分配它才能再次使用free()调用。 所以这个错误正在显现。 尝试在循环之外使用free()。
希望这会有所帮助。

在我看来,您已经在循环中使用了free()调用,一旦内存释放,必须重新分配它,然后才能再次使用free()调用。
memcpy(((*usr_str) + count - bytesread),buf, bytesread);
所以这个错误正在显现。 尝试在循环之外使用free()。 希望这会有所帮助

memcpy(((*usr_str) + count - bytesread),buf, bytesread);
我应该这样做。如果bytesread小于MAX,则您的版本拷贝数将超出分配的缓冲区的末尾


我应该这样做。如果bytesread小于MAX,则您的版本拷贝数超出分配的缓冲区的末尾

char*usr\u数据在for loop.in
memcpy((*usr\u str)+count-bytesread)之前在main中声明,buf,MAX)您确定没有写入超过分配的存储吗???***glibc检测到***free():无效的下一个大小(fast):0x083fc008***中止(内核转储)我猜,您复制的字节数多于分配的字节数。。请检查。否,如果我在main中删除free,它正在工作,但内存泄漏已被删除(显然),我实际上需要在usr_数据中获取数据,并将其发送到不同的函数以处理char*usr_数据在main中声明,然后用于循环。在
memcpy((*usr_str)+count bytesread),buf,MAX)您确定没有写入超过分配的存储吗???***glibc检测到***free():无效的下一个大小(fast):0x083fc008***中止(内核转储)我猜,您复制的字节数多于分配的字节数。。请检查。否,如果我主要删除free,它正在工作,但内存泄漏已被删除(显然),我实际上需要获取usr_数据中的数据,并将其发送到不同的函数进行处理,但一旦释放,它将再次进入读取循环并分配内存。。一旦功能失效,只有它是免费的。。因此,如果我使用外部lloop,内存泄漏也会被解除,如果我只在函数内部使用free。。没有问题。但这并不能解决我的要求。您在free()之后使用realloc(),我认为最好使用alloc()或calloc(),因为realloc()不会重新创建内存指针。但一旦它被释放,它将再次进入读循环并分配内存。。一旦功能失效,只有它是免费的。。因此,如果我使用外部lloop,内存泄漏也会被解除,如果我只在函数内部使用free。。没有问题。但这并不能解决我的要求。您在free()之后使用realloc(),我认为最好使用alloc()或calloc(),因为realloc()不会重新创建内存指针。