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;
}
任何人都可以帮助我吗?感谢。
答案 0 :(得分:1)
你可以两次free()
缓冲区。
要避免这种情况,请free()
ed指针,方法是在NULL
对其指向的内存进行free()
后指定free(tcp->sendbuf);
tcp->sendbuf = NULL;
。
free()
使用此指针调用NULL
的任何子句都将导致无效,因为将free()
传递给free()
是无害的。
对于已传递给{{1}}的任何指针,最好这样做。
答案 1 :(得分:0)
您要么将发送缓冲区释放两次,要么损坏其值,例如:通过tcp->sendbuffer++
。
注意:在释放它们之前,您不需要测试所有这些指针。 free()
已经这样做了。你只是加倍工作。