free()导致malloc_error_break

时间:2013-09-27 15:46:13

标签: c network-programming malloc free sigabrt

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

任何人都可以帮助我吗?感谢。

2 个答案:

答案 0 :(得分:1)

你可以两次free()缓冲区。

要避免这种情况,请free() ed指针,方法是在NULL对其指向的内存进行free()后指定free(tcp->sendbuf); tcp->sendbuf = NULL;

free()

使用此指针调用NULL的任何子句都将导致无效,因为将free()传递给free()是无害的。

对于已传递给{{1}}的任何指针,最好这样做。

答案 1 :(得分:0)

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

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