2

私はこれを読みました: http://www.drpaulcarter.com/cs/common-c-errors.php#2.8 そしてそのようなコードのブロックがあります:

#include <string.h>
#include <stdlib.h>
int main()
{
  char *st = malloc(20);   /* st points to allocated array*/

  strcpy(st, "abc");  /* st points to char array */
  free(st);                /* don't forget to deallocate when done! */
  return 0;
}
4

6 に答える 6

5

ほとんどの正常なオペレーティング システムでは、終了時にクリーンアップする必要はありません。これは良い習慣です。

コードは、メモリの割り当てと解放の単純な例にすぎません。実際のプログラムでは、プログラムの実行中に解放が必要なメモリを追跡します。そうしないと、メモリ (またはアドレス空間の可能性が高い) が不足します。

于 2011-06-01T17:38:25.343 に答える
3

メモリの割り当てと割り当て解除の効果。何らかの目的でメモリを割り当てると、割り当てを解除するまで割り当てられたままになります。割り当てられている間は、他の目的には使用できません。割り当てを解除する理由は、そのメモリを他の用途に使用できるようにするためです。

なぜこれが重要なのか。これは、プログラムが時間の経過とともに新しいメモリチャンクを割り当て続ける場合に重要になります。不要になったときにメモリの割り当てを解除しないと、プログラムでのメモリの使用が増え、増え続け、最終的にはオペレーティングシステムが使用できるメモリのプールを使い果たしてしまう可能性があります。

この例では実際の害はありません。あなたの特定の例では、割り当て解除をスキップしても(おそらく)害はありません。一つには、プログラムはその後すぐに終了するので、プログラムはそのメモリをそれ以上使用しません。別のこととして、他の人が述べているように、Cの典型的な実装では、プログラムは終了時にすべてのメモリを返します。

ただし、プログラムが他の何かのためにメモリを必要とする可能性がある場合、またはプログラムが終了時にメモリをオペレーティングシステムに戻さない場合は、不要になったときにメモリの割り当てを解除することをお勧めします。

ポインタではなく、メモリの割り当てが解除されます。厳密に言えば、その例ではポインタの割り当てが解除されません。ポインタが指すメモリの割り当てを解除します。ポインタはまだそこにあり、実際には、現在割り当て解除されているメモリを指しています。これは、ポインタがまだ所有しているメモリを指しているかのように、誤ってポインタを使い続けた場合に、無限のデバッグの喜びにつながる可能性があります。

于 2011-06-01T18:48:47.107 に答える
3

free()( 経由で) 割り当てたので、( 経由で)割り当てを解除する必要がありますmalloc()。ほとんどの C API では、一般に、ポインターを割り当てた場合、ポインターを解放する責任があります。これが当てはまらない場合もありますが、通常は関数のマニュアル ページでそのように指定されています。

于 2011-06-01T17:34:56.397 に答える
2

プロセスが終了したからといって、割り当てられたメモリがシステムのリソースに戻るという保証はありません。

于 2011-06-01T17:34:31.520 に答える
1

main() 関数では、プログラムが終了すると、明示的に割り当てを解除しなくても、割り当てられたすべてのメモリが OS に返されます。したがって、手動で行うことは一般的に良い習慣として知られており、この「良い習慣」には実際の意味があります。このコードを別の関数、またはメイン内でループ内に配置する場合、プログラムはコードに従ってメモリを割り当ておよび割り当て解除します。コードがループ内にあり、割り当て解除がない場合、最終的にすべてのメモリが消費され、処理しない限りプログラムがクラッシュします。特定の状況では、これはメモリ リークと呼ばれます。だから、良い習慣をよく知ってください! メモリーリーク

于 2011-06-01T17:44:06.147 に答える
1

そうしないと、C メモリ アロケータは、使用が終了したことを認識しません。

于 2011-06-01T18:19:07.467 に答える