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;
}

私の質問は次のとおりです。
メイン内で行うのは良いこと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_ipcouldのヘッダー ファイルはパラメーター#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);

呼び出しコードを再コンパイルする機会なしにその数17が将来変更される可能性がある場合 (たとえば、これがライブラリであり、バイナリ互換性が必要な場合)、動的割り当てが正当化されます。

于 2012-08-28T11:22:28.887 に答える