2

主要的:

char *tmpip;
tmpip = get_public_ip();

函数get_public_ip:

char * get_public_ip(void){
    char *ipresult;

    if(((ipresult = malloc(17))) == NULL){
        perror("malloc on pub ip");
        exit(1);
    }


    if(fgets(ipresult, 16, tmpfp) == NULL){
        perror("fgets error pubip");
        exit(1);
    }
    fclose(tmpfp);
    return ipresult;
}

我的问题是:
在main里面做是好free(tmpip)还是错?

4

3 回答 3

4

这是一种很好的编码方式:您malloc()在函数中保留一些内存,并且free()在不再需要时使用它。一定要注释你的函数或原型,它将malloc()需要内存,这样你就知道你必须这样free()做。

于 2012-08-28T10:42:38.387 回答
1

为什么会出错?您实际上没有任何其他选择可以在其他地方释放分配的缓冲区...在 C 中调用分配内存的函数,然后使调用者(外部)函数负责释放该内存是惯用的。

于 2012-08-28T10:39:41.567 回答
1

如果使用动态分配,那么释放指针free(tmpip)绝对是好的!该函数get_public_ip只需要记录要释放资源,调用者必须确保free在返回值上被调用。

另一种方法是提供一个函数void free_public_ip(char*buf) {free(buf);},并记录调用者必须使用它来释放资源。这为您在将来更改内存分配方式提供了一些灵活性,而无需调用代码更改。这当然没有必要。

malloc在我看来,像这样的固定大小的小型缓冲区并没有什么意义。头文件get_public_ip可以#define PUBLIC_IP_SIZE (17)并带一个char*参数,然后调用者可以这样做:

char tmpip[PUBLIC_IP_SIZE];
get_public_ip(tmpip);
// no more thinking required

代替:

char *tmpip = get_public_ip();
// code here, perhaps does more things that could fail, 
// maybe some thinking required to ensure every code path passes through:
free(tmpip);

If that number 17 can change in future without the opportunity to re-compile the calling code (for instance if this is a library and you require binary compatibility), then dynamic allocation would be justified.

于 2012-08-28T11:22:28.887 回答