gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:16:18 25 4
gpt4 key购买 nike

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

我的方法是这样的:

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

最佳答案

你应该查看手册。

$man inet_ntoa

... The inet_ntoa() function converts the Internet host address in, given in network byte order, to a string in IPv4 dotted-decimal notation. The string is returned in a statically allocated buffer, which subse‐ quent calls will overwrite.

这意味着在您的应用程序中您将拥有一个静态分配的缓冲区,并且您对其中的内容负责。在您的应用程序中对 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 库提供的便利函数。

关于c++ - 谁需要释放返回 char* 的系统调用的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com