2

たった今尋ねられたこの質問を見てください:静的変数へのポインタの不便は、このようなことをするのは悪い習慣と見なされますか?

char* strpart(char* string, int start, int count)
{
    char* strtemp; 
    int i = 0; int j = 0;
    int strL = strlen(string);

    if ( count == 0 )
    {
        count = strL;
    }

    strtemp = (char*) calloc((count + 1), sizeof(char));
    for ( i = start; i < (start+count); i++ )
    {
        strtemp[j] = string[i];
        j++;
    }
    return strtemp;
}

申し訳ありませんが、すぐに記述されますが、基本的な原則は、関数内で静的バッファーを使用しない場合、関数内でメモリを割り当てるのは悪い習慣ですか?解放されないのでそうだと思いますよね?しかし、私は尋ねるべきだと思った。

4

5 に答える 5

7

これは悪い習慣ではありませんが、メモリリークを簡単に引き起こす可能性があります(呼び出し元はメモリを解放することを忘れないでください)。

私がやりたいことの1つは、命名規則を使用して、どの関数を割り当てることができるかを示すことです。たとえば、その関数に次の名前を付けます。

char* strpart_alloc(char* string, int start, int count)
于 2010-02-09T18:34:17.030 に答える
4

関数内でメモリを動的に割り当てることは常にOKです。ただし、そのメモリへのポインタを外部に返し、他の誰かがそれを解放したり、関数内で自分で解放したりできるようにします。

于 2010-02-09T18:33:28.013 に答える
2

まあ、それは危険です。可能な限り避けたいと思います。

あなたの仮定は正しいです-メモリは自動的に解放されません。

問題は、ここでの戻り値がヒープに割り当てられたメモリであるということです。関数の呼び出し元は、解放することを忘れないでください。ここでは、(あなたによって)解放されないメモリを割り当てています。APIのユーザーに制約を課すことは常に悪い考えです。

時々(まれに)これを避けることができないので、これを行う場合は、それを非常に明確に文書化するようにしてください。

于 2010-02-09T18:32:16.080 に答える
2

これを行うのが一般的です。ドキュメント「API」で、終了時に返されたポインタを解放するのは呼び出し元の責任であることに明確に注意する必要があります。

于 2010-02-09T18:35:14.547 に答える
2

それは悪い習慣ではありません。malloc関数が-ed(または-ed)メモリを返すという事実は、callocその外部仕様の一部になります。free不要になった場合は、発信者の責任となります。

しかし、それはエレガントではありません。1)呼び出し元がそれを避けたい場合は動的メモリの使用を強制し、2)呼び出し元が独自の動的メモリを使用したい場合は特定の種類の動的メモリ(malloc-ed )の使用を強制するため、エレガントではありません。割り当てメカニズム。

于 2010-02-09T18:41:22.903 に答える