すでに存在する環境変数に putenv() を使用すると、メモリはどうなりますか?

すでに存在する環境変数に putenv() を使用すると、メモリはどうなりますか?

環境は本質的に文字列へのポインタ配列であることを理解しています。したがって、これらの文字列が占めるメモリを解放すると、その環境変数が失われます。

環境文字列にメモリを割り当て、それを使用してputenv()既存の変数を設定すると、メモリリークが発生しますか?

次のCプログラムで示されています。

char ** environ;

main()
{
  /* 
     Code for printing all environment variables
  */ 

  char * temp = (char *)malloc( 64 * sizeof(char));
  strcat(temp, "");
  strcat(temp, "PWD=/home/mycomputer/");
  putenv(temp);

  /*
     Code for printing all environment variables 
  */
}

このPWD環境変数はすでにいくつかのメモリ(パスを含む)を指しており、現在より多くのメモリ(パスを含む)を割り当てました。したがって、ポインタが新しい場所に移動し、古いメモリにアクセスすることはできませんが、それでも割り当てられます。それでは、プログラムにメモリリークがあると言うのは正しいですか?そうでない場合、この変更はメモリにどのように受け入れられますか?

ベストアンサー1

あなたの観察は正しいです。割り当てた新しい文字列はmalloc古い文字列を置き換え、古い文字列は廃止されました。前の文字列は、プログラムの起動時に渡された環境の一部である場合はスタックセグメントの一部です(つまり、プロセスで変数が最初に変更された場合)。

これがメモリリークかどうかは議論の余地があります。以前の文字列が占有していたメモリを解放することはできませんが、そのメモリを再利用するための合理的な方法はありません。putenv複数回呼び出すと、free文字列が使用されなくなったときに自己割り当てメモリを使用できます。

putenvドキュメントに記載されているように、glibcのバージョンによって意味が異なります。マニュアルページ

ところで、代わりにプログラムにバグがあります

strcat(temp, "");
strcat(temp, "PWD=/home/mycomputer/");

あなたは書かなければなりません

strcpy(temp, "PWD=/home/mycomputer/");

おすすめ記事