2

wcsdupのような関数は、暗黙的にmallocを呼び出して、宛先バッファーにメモリーを割り当てます。メモリの割り当てはあまり明示的ではないので、ストレージを明示的に解放するのは論理的だと思いましたか?これは設計のジレンマに似ており、その理由と反対の理由は次のとおりです。

理由で解放する必要があります

  1. 解放しないと、メモリリークが発生します。
  2. wcsdup / _wcsdupがmallocを呼び出して、C ++プログラムから呼び出された場合でも、メモリを割り当てることは十分に文書化されています。

なぜなら解放されるべきではない

  1. wcsdupによって蓄積されたメモリは、プログラムの終了時に最終的に解放されます。プログラムの存続期間中、常にメモリリークが発生します(バッファサイズが大きい場合にwcsdupを頻繁に呼び出す場合を除く)。
  2. freeの前に明示的なmallocがなかったため、混乱する可能性があります。
  3. これは標準の一部ではありませんが、posixに準拠しているため、Microsoftの実装では、宛先バッファーの割り当てにmallocを使用しない場合があります。

アプローチはどうあるべきですか?

4

3 に答える 3

12

MSDNから:

返されたポインタで空きルーチンを呼び出して、このメモリを常に解放することをお勧めします

リンクしたページから:

返されたポインタはfree()に渡すことができます

かなり明白なようです。メモリリークが気になる場合は、を使用してメモリを解放する必要がありますfree

正直なところ、私はこれでほのめかされた騎士の態度について心配しています:

プログラムの存続期間中、私たちは常にメモリリークが発生しています。

メモリをリークする正当な理由はめったにありません。あなたが今日書いたコードが一回限りのものであり、それが長期的なプロセスではない場合でも、誰かがそれをコピーして他のプログラムに貼り付けないことを確信できますか?

于 2012-04-27T09:16:09.690 に答える
2

はい。使用が終了し、安全に使用できることを知っている場合は、ヒープに割り当てられたメモリを常に解放する必要があります。リンク先のドキュメントには次のように記載されています。

malloc()のようにメモリを割り当てる関数の場合、アプリケーションは、free()の呼び出しでメモリが不要になったときに、そのようなメモリを解放する必要があります。wcsdup()の場合、これは戻り値です。

無料が混乱する可能性があることを懸念している場合は、それを説明するコメントを残してください。正直なところ、それは不必要に思えます。ポインタが明示的に解放されると、ポインタを解放するコードによって「所有」されていることは明らかであり、混乱した人は誰でも簡単にwcsdupドキュメントを検索できます。

また、プログラムでメモリリークが発生することはありません。実際には、一部のプログラムにはメモリリークがありますが、それはそれらが存在しても問題がないという意味ではありません。また、プログラムの存続期間全体にメモリブロックが割り当てられているという理由だけで、その期間全体にわたってメモリを使用している場合でも、メモリリークは発生しないことに注意してください。

于 2012-04-27T09:15:58.237 に答える
0

あなた自身のリンクから:

malloc()のようにメモリを割り当てる関数の場合、アプリケーションは、free()の呼び出しでメモリが不要になったときに、そのようなメモリを解放する必要があります。

MSDNから:

_strdup関数は、mallocを呼び出してstrSourceのコピーにストレージスペースを割り当ててから、strSourceを割り当てられたスペースにコピーします。

また、strdupはMSVC 2005から非推奨になり、それを呼び出すと_strdupが呼び出されるため、mallocを使用します。

于 2012-04-27T09:17:49.407 に答える