2012-07-16 52 views
0

我希望实现一个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); 
+0

请修复缩进。 – sean 2012-07-16 21:02:28

+0

您需要通过检查malloc调用后的handshake_part3的值来检查内存是否在第一位分配: – Raj 2012-07-16 21:03:06

+0

为什么'malloc'在第一位? – netcoder 2012-07-16 21:17:50

回答

3

您重新分配handshake_part3是常量字符串"\r\n...";你的意思是strcpy()(最好是strncpy()或等效的!

2

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

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字符串字符串分配给分配的缓冲区,或避免分配和释放。

+0

很明显,避免分配是一条路。 – netcoder 2012-07-16 21:20:47

0

看看这段代码:

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

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

这是我一眼注意到的唯一的东西,但我有一种感觉,可能会有更多...

编辑:而寻找其他的答案,我可以看到确有“更”

+0

那该怎么办? Dint完全让你。 – 2012-07-16 21:21:52

+0

我不确定你的代码是否完全理解C语言中的内存管理 - 你有很多地方在malloc里面有一些内存,然后用别的东西('final','handshake_part2', 'handshake_part3')。当你做'final = strcat(key,magic)'时,你认为发生了什么? – 2012-07-16 21:26:29

+0

strcat在这里追加魔术,最后赋予空字符,并从键的结尾移除。目的地被退回。 因此,如果我没有错,它将最终的相同作为关键字。 – 2012-07-16 21:43:37