我的功能:

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例如,调用者应该做到这一点,一个指针传递到结构。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top