2013-09-27 2 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의 모든 멤버를 해제하는 것을 목표로합니다. 이 구조에는 연결 클라이언트 - 서버에 대한 모든 정보가 들어 있습니다.free()는 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 함수에서 반환 된 주소에 대해서는 free를 호출 할 수 있습니다. –

+0

'tcp-> sendbuf'가 참조하는 메모리를 할당하는 방법을 보여주세요! – Oswald

+0

디버그 메시지에서 '포인터가 해제되었습니다. 할당되지 않았습니다.'라는 메시지가 나타납니다. 아마도'malloc' 패밀리 함수를 사용하여 할당되지 않은 메모리 바이트를'free'하려고 시도했을 것입니다. 나는'tcp-> sendbuf'가 스택상의 메모리 영역이나 이전에 릴리즈 된 메모리 영역을 가리킨다 고 추측한다. – sgnsajgon

답변

1

적절하게는 free() 버퍼를 두 번 사용하십시오.

free()이 가리키는 메모리를 편집 한 후 NULL을 할당하여이 포인터를 free() 포인터로 표시하지 않도록하십시오.

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

모든 subsequend는 free()-NULL가 무해 통과로 아무것도하지 않고 발생합니다이 포인터를 사용하여 free() 호출합니다.

free()으로 전달 된 모든 포인터에 대해 그렇게하는 것이 좋습니다.

+0

free()가 개선되었습니다. 올바르게 작동합니다 내가 t 이상으로 수술하기 시작할 때까지 cp-> sendbuf "atoi (tcp-> sendbuf) == ERROR"... – EngAndreaR

+0

@EngAndreaR : "* ... 무료() 제대로 작동 ... *": 귀하의 질문에 언급 : "* ... 나는 무료 (tcp-> sendbuf) 오류를 관찰한다; ... * "그럼 뭐라 구요? – alk

+0

죄송합니다.이 프로젝트에서 "close_TCP_connection"함수는 "tcp-> sendbuf"를 통해 일부 작업을 시작하기 전까지 올바르게 작동합니다. 이 작업은 "if (atoi (tcp-> sendbuf) == -1)"입니다. 나는 당신에게이 작업이 "free()"작업에 문제를 야기 할 수 있다고 묻는다. – EngAndreaR

0

송신 버퍼를 두 번 비우거나 그렇지 않으면 값이 손상됩니다. 예 : tcp->sendbuffer++을 통해

NB 포인터를 해제하기 전에 모든 포인터를 테스트 할 필요가 없습니다. free() 이미 그것을 않습니다. 당신은 그 일을 두 배로 늘리고 있습니다.

관련 문제