`./px' 中的错误:free():无效的下一个大小(正常)中止(核心转储)

Error in `./px': free(): invalid next size (normal)Aborted (core dumped)

您好,我在很多讨论中都在寻找解决方案,不幸的是没有得到任何帮助。

我有一个代理服务器,它接受一个客户端的请求并请求服务器的响应,我遵循的步骤是:

1--> 我从客户端向代理发出请求。

2--> 代理连接到服务器并向客户端发送响应(直到这里一切正常)。

3--> 当我从同一个客户端向代理发出第二次请求时,当代理尝试第二次连接到服务器时,出现此错误:

* Error in `./px': free(): invalid next size (normal): 0x0000000001941120 Aborted (core dumped) *

错误发生的方法如下:

char * readResponseFromServer(char *hostname,char *request,char *response){
int sock;
struct sockaddr_in serv_addr;
struct hostent * server;

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock<0)
    printEror("socket opening error");

server=gethostbyname(hostname);

if (server == NULL)
      printEror ("unknown host");
printf("the server adress is  %s\n",server->h_name);

bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr,
     server->h_length);
serv_addr.sin_port = htons(80);


if(connect(sock,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
     {
            printEror("connection error");

    }
int n1 = write(sock,request,strlen(request));
if (n1< 0) 
        printEror("ERROR writing to socket");
//reading response from server
int readed=0;
int bytesloaded=0;
int buf_size=512;
//we try to read 256 bytes each time
while( (readed = read(sock, response+ bytesloaded, buf_size)) > 0 )
    {   

    if(bytesloaded + readed >= buf_size)//the response buffer is full , so we allocate more memory
    {
        buf_size = buf_size + 256;  
        response = (char *)realloc(response, buf_size);

    }
    bytesloaded += readed;
    }

printf("the response is: %s",response);
close(sock);

}

特别是在这次通话中:

    server=gethostbyname(hostname);

总而言之,当我多次按时调用上述方法时出现此错误。

为什么我会收到这个错误?

非常感谢。

解法:

我使用了不同的建议来解决我的问题,再次感谢你。

主要问题是:

  1. free() 方法的内存释放问题。
  2. 重新分配内存的糟糕方法。

错误不在我发布的方法中,而是在另一种方法中,尽管程序在其他地方停止了,所以这是我从这个问题中学到的一件事:内存错误可能来自程序中的任何地方。

所以我不得不检查我的程序,并设法找出错误内存在哪里。

  • Error in `./px': free(): invalid next size (normal): 0x0000000001941120 Aborted (core dumped) *

在您的代码中,假设内存用于以下原型中使用的 char *request 变量:

char * readResponseFromServer(char *hostname,char *request,char *response){

在调用函数中提供并释放...
...然后,如果需要在被调用函数中更改缓冲区的内存,调用者必须传递变量的地址,而不是变量本身。这样,realloc() 可以在被调用函数中使用,同时为调用者​​提供释放内存的能力。这是一个片段,显示了它如何使用 realloc():

void growBuffer(char ** b, int *size);//note prototype include char **, not char *

int main(void) 
{ 
    char *buf = {0};
    buf = calloc(20,1);
    strcpy(buf, "original string-");
    int len = strlen(buf)+1;
    printf("Original buf and length: %s - %d\n", buf, len);
    growBuffer(&buf, &len);//caller passes address of buf: (&buf) 
    printf("New buf and length: %s - %d\n", buf, len);
    free(buf);//caller can now safely free memory

    return 0;
}



void growBuffer(char **buffer, int *size)
{
    const char newContent[]={"new content requires growing buffer"};

    int newlen = *size + strlen(newContent) + 1;

    char *buf = realloc((*buffer), newlen );
    if(buf)//always test return of [m][c][re]alloc before using
    {
        (*buffer) = buf; //assign new memory to buffer
        strcat((*buffer), newContent);//modify string
        *size = newlen;//pass back new len of string
    }
}