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(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;
}

誰でも私を助けることができますか?ありがとう。

4

2 に答える 2

1

おそらくfree()バッファを2回使用します。

これを回避するには、 ed ポインタが指すメモリを ed した後にfree()割り当てることにより、ed ポインタをそのようにマークします。NULLfree()

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

このポインターを使用するための後続の呼び出しは、に渡すことは無害であるfree()ため、何もしません。NULLfree()

に渡されたすべてのポインタに対してこれを行うことをお勧めしますfree()

于 2013-09-27T15:59:36.337 に答える