谁需要释放返回char *的系统调用内存

时间:2012-08-21 22:08:00

标签: c++ c

如果我调用像inet_ntoa那样返回char *的函数。 谁负责释放分配的内存?

我的方法如下:

char* inet_aton_(unsigned int atonIp){
    in_addr sin_addr;
    sin_addr.s_addr = atonIp;
    return inet_ntoa(sin_addr);
}

3 个答案:

答案 0 :(得分:7)

您应该查看手册。

$ man inet_ntoa

  

...   inet_ntoa()函数转换给定的Internet主机地址   以网络字节顺序,以IPv4点分十进制表示法的字符串。   该字符串在静态分配的缓冲区中返回,该缓冲区   quent调用将覆盖。

这意味着在您的应用程序中,您将拥有一个静态分配的缓冲区,并且您负责其中的内容。每次调用应用程序中的inet_ntoa()都将覆盖此区域。如果需要保留两个地址,则必须将此数据复制到另一个缓冲区。您还负责在线程应用程序中以正确的方式使用,例如,如果您有两个线程同时调用inet_ntoa,您将得到错误的结果,或者对具有不同参数的inet_ntoa进行两次单独调用将返回相同的结果。

当您遇到此类问题时,您还应该查看源代码。例如,如果您搜索“inet_ntoa source”。你可能会遇到一些例子; freebsdms。下面是一个示例实现(来自freebsd)。

char *
inet_ntoa(struct in_addr ina)
{
    static char buf[4*sizeof "123"];
    unsigned char *ucp = (unsigned char *)&ina;

    sprintf(buf, "%d.%d.%d.%d",
        ucp[0] & 0xff,
        ucp[1] & 0xff,
        ucp[2] & 0xff,
        ucp[3] & 0xff);
    return buf;
}

正如您所看到的,它只有一个静态缓冲区,仅用于此目的。这使得inet_ntoa的使用非常简单,因为您不需要管理缓冲区,但也使它不是线程安全的。

另一件事,inet_ntoa不是系统调用。它可以被称为inet库提供的便利功能。

答案 1 :(得分:3)

引用manpage

  

该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区。

这意味着没有人需要也不应该试图释放记忆。

答案 2 :(得分:1)

所以,先关闭;这些功能已被弃用,因为它们不支持IPv6。其次......请查阅文档。当一个函数返回一个指针时,应该清楚地记录谁负责解除它。

在这种情况下,您不负责解除分配(也不应该!)。

  

inet_ntoa()返回静态缓冲区中的点数和数字字符串,每次调用该函数都会被覆盖。