2012-07-16 86 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