簡體   English   中英

釋放內存時出現分段錯誤

[英]Segmentation fault while freeing memory

我希望實現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);

您正在將handshake_part3重新分配為常量字符串"\\r\\n..." 您的意思是用strcpy() (最好是strncpy()或同等的東西!)代替嗎?

您正在釋放常量字符串。 內存泄漏是因為調用malloc之后,您分配了常量字符串(並且malloc的內存泄漏)。

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

您將一個字符串常量分配給handshake_part3 ,然后嘗試釋放它……這將導致分配錯誤的緩沖區泄漏,從而使您的free崩潰。 您應該將該字符串文字strcpy到已分配的緩沖區,或者避免分配和釋放。

看下面的代碼:

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

您要做的是放棄新分配的final ,並用key的地址覆蓋它。 之后,您將其刪除兩次(一次通過final ,一次通過key ),這是不允許的。

這是我一眼看到的唯一一件事,但我感覺可能還有更多...

編輯:查看其他答案,我可以看到確實存在“更多”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM