2013-09-27 61 views
1
void close_TCP_connection(TCP_Connection *tcp) 
{ 
    if (tcp) 
    { 
    printf(" CHIUSURA %s\n", tcp->sendbuf); 
    if (tcp->sockfd) 
    { 
     socketDestroy(tcp->sockfd); 
    } 

    if (tcp->recvbuf) 
    { 
     free(tcp->recvbuf); 
    } //fi 

    if (tcp->sendbuf) 
    { 
     printf(" CHIUSURA 2%s\n", tcp->sendbuf); 
     free(tcp->sendbuf); 
    } //fi 

    if (tcp->addr) 
    { 
     free(tcp->addr); 
    } //fi 
    } //fi 
} 

我有這個功能插入一個非常偉大的項目。該函數的目標是釋放結構TCP_connection的所有成員。該結構包含有關連接客戶機 - 服務器的所有信息。免費()導致malloc_error_break

當我啓動該程序時,我觀察到free(tcp->sendbuf);中的錯誤,該線上的printf正常工作。我有,當我調試的代碼是錯誤:

215    free(tcp->sendbuf); 
(gdb) 
charms_client(49045) malloc: *** error for object 0x10006ec80: pointer being freed was  
not allocated 
*** set a breakpoint in malloc_error_break to debug 

Program received signal SIGABRT, Aborted. 
0x00007fff8ccddd46 in __kill()enter code here 

我在另一個函數分配結構

int init_TCPConnection(TCP_Connection *tcp, char *servername, int server_port, int client_port) 
{ 
    tcp->sendbuf = (char *) malloc(sizeof(char) * MAX_BUF_LEN); 
    tcp->sendlen = (size_t)MAX_BUF_LEN; 
} 

誰能幫助我?謝謝。

+0

您可以免費撥打從malloc/calloc函數返回的地址。 –

+0

向我們展示如何分配'tcp-> sendbuf'引用的內存! – Oswald

+0

在調試消息中你有一個問題的答案:'釋放的指針未被分配'。可能你嘗試使用'malloc'系列函數來分配'free'內存字節。我猜'tcp-> sendbuf'指向堆棧上的內存區域,或指向之前釋放的內存區域。 – sgnsajgon

回答

1

你可以推薦free()緩衝區兩次。

爲了避免這個標記free() ed指針,通過free()指定它的內存後指定NULL ed指針。

free(tcp->sendbuf); 
tcp->sendbuf = NULL; 

任何subsequend使用該指針將導致無所事事的傳遞NULLfree()是無害的調用free()

對於任何已經傳遞到free()的指針,這樣做是很好的做法。

+0

感謝您的改進@alk ... free()能夠正常工作直到我開始對t做手術cp-> sendbuf比如「atoi(tcp-> sendbuf)== ERROR」... – EngAndreaR

+0

@EngAndreaR:「* ... free()工作正常...... *」:在你的問題中你提到:「* ...我觀察到免費錯誤(tcp-> sendbuf); ......「那麼請怎麼辦? – alk

+0

對不起。在這個項目中,這個函數「close_TCP_connection」正常工作,直到我開始對「tcp-> sendbuf」進行一些操作。這個操作是「if(atoi(tcp-> sendbuf)== -1)」。我問你,如果按照你的說法,這個操作可能會給free()操作帶來問題 – EngAndreaR

0

您要麼釋放發送緩衝區兩次,要麼就是破壞其值(例如,通過tcp->sendbuffer++

注意在釋放它們之前,不需要測試所有這些指針。 free()已經做到了。你只是把工作翻倍。