`./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);
总而言之,当我多次按时调用上述方法时出现此错误。
为什么我会收到这个错误?
非常感谢。
解法:
我使用了不同的建议来解决我的问题,再次感谢你。
主要问题是:
- free() 方法的内存释放问题。
- 重新分配内存的糟糕方法。
错误不在我发布的方法中,而是在另一种方法中,尽管程序在其他地方停止了,所以这是我从这个问题中学到的一件事:内存错误可能来自程序中的任何地方。
所以我不得不检查我的程序,并设法找出错误内存在哪里。
- 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
}
}
您好,我在很多讨论中都在寻找解决方案,不幸的是没有得到任何帮助。
我有一个代理服务器,它接受一个客户端的请求并请求服务器的响应,我遵循的步骤是:
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);
总而言之,当我多次按时调用上述方法时出现此错误。
为什么我会收到这个错误?
非常感谢。
解法:
我使用了不同的建议来解决我的问题,再次感谢你。
主要问题是:
- free() 方法的内存释放问题。
- 重新分配内存的糟糕方法。
错误不在我发布的方法中,而是在另一种方法中,尽管程序在其他地方停止了,所以这是我从这个问题中学到的一件事:内存错误可能来自程序中的任何地方。
所以我不得不检查我的程序,并设法找出错误内存在哪里。
- 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
}
}