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()会缓冲两次。

为了避免这种情况,通过在ed 指向的内存之后free()分配NULL它来标记 ed 指针。free()

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

使用此指针的任何后续调用free()都将导致什么也不做,因为传递NULLfree()是无害的。

对于任何已传递给free().

于 2013-09-27T15:59:36.337 回答
0

您要么释放发送缓冲区两次,要么破坏其值,例如通过tcp->sendbuffer++.

注意:您不需要在释放它们之前测试所有这些指针。free()已经这样做了。你只是加倍工作。

于 2013-10-04T01:43:12.407 回答