36
 char * val;                                                                        
 val = getenv("ENV_VAR_NAME");

上記は環境変数を取得するコードですが、 getenv(char*) によって返されたメモリを解放しないとメモリ リークが発生しますか? いいえの場合、理由を教えてください。

4

5 に答える 5

42

いいえ、すべきではありません。標準 7.20.4.5 は次のように述べています。

getenv 関数は、一致したリスト メンバーに関連付けられた文字列へのポインターを返します。指す文字列はプログラムによって変更されませんが、その後の getenv 関数の呼び出しによって上書きされる可能性があります。

削除は太字のテキストでカバーされていると思います。

于 2010-11-21T12:34:16.750 に答える
11

解放しないでください。これはmanページからのスニペットです:

一般的に実装されているように、getenv() は環境リスト内の文字列へのポインターを返します。プロセスの環境が変更されるため、呼び出し元はこの文字列を変更しないように注意する必要があります。

触らないで!

于 2010-11-21T12:32:19.513 に答える
9

いいえ。ストレージを制御することはできません。通常、これは複数回再利用される静的配列へのポインターです。このため、後で使用するために保存する場合は、コピーする必要があります (このコピーが適切に解放されていることを確認する必要があります)。

ドキュメントに明示的にポインタを解放できると書かれていない限り、そうすべきではありません。

于 2010-11-21T12:32:39.277 に答える
5

削除してはいけません。Getenv は、すべての環境変数を含む char* 配列 (私の記憶が正しければ char** 環境) から値を取得するだけです。それらを削除すると、未定義の動作が発生します。

于 2010-11-21T12:34:43.693 に答える
2

おそらく最も良い理由は、標準があなたができると言っていないということです。関数がポインタを返すからといって、ポインタがに渡されるのが有効であるとは限りませんfree。関数のドキュメントに、関数が「呼び出すようにmalloc」メモリを割り当て、そのメモリへのポインタを返すと明記されていない限り、reallocまたはに渡すポインタは無効であると想定する必要がありますfree

于 2010-11-21T12:48:39.150 に答える