释放内存时出现分段错误

时间:2012-07-16 21:00:38

标签: c

我希望实现一个Web套接字握手,为此我使用以下代码片段。 但是当我开始释放我动态分配的内存时,我会出现分段错误。错误出现在我第一次使用自由功能的地方。请帮忙。

char rbuf[656];        
char handshake[800];
char *handshake_part2, *handshake_part3,*key,*magic,*final;
unsigned char hash [20];

key=strndup(rbuf+359, 24);     
magic = malloc(strlen("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")+2);
strcpy(magic,"258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
final = malloc (60);
final = strcat(key,magic);   
SHA1(final,strlen(final),hash);
base64(hash, sizeof(hash));
handshake_part2= malloc(400);
handshake_part2= base64(hash, sizeof(hash));
strcpy (handshake,"HTTP/1.1 101 Web Socket Protocol Handshake\r\nUpgrade: Websocket\r   \nConnection: Upgrade\r\nSec-WebSocket-Accept: ");
strcat(handshake,handshake_part2);
handshake_part3= malloc(400);
handshake_part3="\r\nWebSocket-Origin: http://localhost:9605\r\nWebSocket-Location: ws://localhost:9609/\r\n\r\n";
strcat(handshake,handshake_part3);
printf("Response Header :\n%s", handshake);

free(handshake_part3);
handshake_part3=NULL;
printf("Free 1");
free(handshake_part2);
handshake_part2=NULL;
printf("Free 2");
free(final);`
final=NULL;
printf("Free 3");
free(magic);
magic=NULL;
printf("Free 4");
free(key);

4 个答案:

答案 0 :(得分:3)

您将handshake_part3重新分配为常量字符串"\r\n...";你的意思是strcpy()(最好是strncpy()或同等的!)这个呢?

答案 1 :(得分:2)

你释放一个常量字符串。内存泄漏是因为在调用malloc之后,您分配了常量字符串(并且malloc' d内存被泄漏)。

答案 2 :(得分:1)

handshake_part3= malloc(400); 
handshake_part3="\r\nWebSocket-Origin: http://localhost:9605\r\nWebSocket-Location: ws://localhost:9609/\r\n\r\n";

您将字符串文字指定给handshake_part3,然后尝试释放它...这会导致mallocated缓冲区泄漏,并导致free崩溃。你应该strcpy该字符串文字到分配的缓冲区,或者避免分配和释放。

答案 3 :(得分:0)

看看这段代码:

final = malloc (60);
final = strcat(key,magic); 

你做的是放弃新分配的final并用key的地址覆盖它。稍后您将其删除两次(一次通过final而不是通过key),这是不允许的。

这是我一眼就注意到的唯一一件事,但我觉得可能会有更多......

编辑:看看其他答案,我看到的确有“更多”