在C:为什么一个堆栈中分配功能的结构中存在么?
-
23-09-2019 - |
题
我的功能:
struct hostent * gethost(char * hostname){
if(/*some condition under which I want
to change the mode of my program to not take a host*/){
return null
}
else{
struct hostent * host = gethostbyname(hostname);
return host;
}
}
在主:
struct hostent * host = gethost(argv[2]);
(忽略代码中的任何的小错误,我是从存储器喷涌)
此工作正常。和Valgrind的不告诉我,我失去了记忆,尽管我不是释放的事实。
为什么呢?我认为在与函数调用返回堆栈分配消失的东西?还是因为我返回指针?这是危险的任何方式?
解决方案
host
没有被分配在堆栈上,只有一个指向它的指针是在堆栈中。当函数返回,所以没有什么错误的代码的指针被复制。
请注意gethostbyname
实际上不动态地分配存储器。它总是返回一个指向相同的内存静态分配的块,这就是为什么Valgrind的不报告泄漏。要小心,虽然,因为这意味着你必须复制你的函数返回的hostent
如果你想保存价值的,后来因为要gethost
还呼吁将覆盖它。
其他提示
它的优良和不泄漏,因为返回的指针不指向上堆栈或堆数据,但是一些静态变量。
http://linux.die.net/man/3/gethostbyname :
的功能的gethostbyname()和gethostbyaddr()可以返回的指针的静态数据,其可以通过以后的调用强>被覆盖。复制结构hostent是不够的,因为它包含指针;深层副本是必需的。
这本手册:
RETURN VALUE
The gethostbyname() and gethostbyaddr() functions return the hostent
structure or a NULL pointer if an error occurs. On error, the h_errno
variable holds an error number. When non-NULL, the return value may
point at static data, ...
一些存储器在编译时保留(即,二进制的代码内),用于结构,该函数返回一个指针,指向该存储器。
好内存不被泄露,直到所有对它的引用都将丢失,在你的榜样返回指针因此仍有对它的引用。
但恕我直言,这是在大多数情况下,一个不好的设计决定依靠代码释放动态内存的另一部分。如果函数需要返回一个struct例如,调用者应该做到这一点,一个指针传递到结构。
不隶属于 StackOverflow