C言語のfree関数及び野指針の紹介


【FROM MSDN&百科】原型:void free(void*ptr);刋include<stdlib.h>または嚔include<mallo c.h>Deallocate space in memoryはptrが指す記憶空間を解放する。解放された空間は通常、利用可能な記憶領域プールに送られ、その後、malloc、realloc、およびrealloc関数を呼び出して再割り当てすることができる。注意:free関数を二回連続して使うと、必ずエラーが発生します。mallocの回数はfreeの回数と同じです。A block of memory previously allocated using a call to mallo c、caloc or realloc is deallocated、making it available again for further allocations.If ptr does not point a block of memory located theablethe function does nothingNotice that this function does not change the value of ptr itself、hence it still points to the same(now invalid)locationdemo:

//#define  FIRST_DEMO
#define  SECOND_DEMO
#ifdef FIRST_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
 int *buffer1,*buffer2,*buffer3;
 buffer1=(int *)malloc(100*sizeof(int));
 buffer2=(int *)calloc(100,sizeof(int));
 buffer3=(int *)realloc(buffer2,500*sizeof(int));
 free(buffer1);
 free(buffer3);
 getch();
 return 0;
}
#elif defined SECOND_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
 char *str;
 /*allocate memory for string*/
 str=(char *)malloc(10);
 if (str==NULL)
 {
  perror("malloc");
  abort();
 }
 else
 {
  /*copy "hello" to string*/
  strcpy(str,"hello");
  /*display string*/
  printf("String is %s
",str);
  /*free memory*/
  free(str);
 }
 getch();
 return 0;
}
#endif
DEMO:perrorperperror()は、前の関数にエラーが発生した原因をデバイスstderに出力します。パラメータsで指定された文字列は先に印刷され、後にエラーの原因文字列が追加されます。このエラーの原因はグローバル変数errnoの値に基づいて出力する文字列を決定します。

#include <stdio.h>
#include <stdlib.h>   //perror
#include <conio.h>
int main(void)
{
    FILE *fp;
 fp=fopen("abc","r+");
 if (NULL == fp)
 {
  perror("abc");
 }
 getch();
 return 0;
}
output:abc:No such file or directoryDEMO:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
 char *ptr;
 ptr=(char *)malloc(100);
 strcpy(ptr,"Hello");
 free(ptr);    //<span style="font-family: arial, , sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;">&nbsp;ptr , ptr , “ ” ( )</span>
#if 1
 if (ptr!=NULL)    /*<span style="font-family: arial, , sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;">&nbsp; </span>*/
 {
  strcpy(ptr," world");
  printf("%s
",ptr);
 }
#endif
 getch();
 return 0;
}
free(str)の後で針は依然としてもとの積み重ねの住所を指して、つまりあなたは依然として引き続き使うことができて、しかしとても危険で、オペレーティングシステムはすでにこのメモリが使うことができると思っているため、彼は考慮しないで他のプログラムに配給して、そこであなたが次に使う時すでに他のプログラムに変えられたかもしれません。この場合は「野の針」といいますので、free()を使ってから、ロスト=NULLを置くといいです。つまり、このプログラムはもう諦めました。彼を使います。「野の指針」とは、ここで補充します。野ポインタとは、プログラマや操作者がコントロールできないポインタのことです。野の針はNULLの針ではなく、「ゴミ」の針を指しています。
「野ポインタ」の原因は主に1つあります。ポインタ変数は初期化されていません。任意のポインタ変数が作成された直後は自動的にNULLポインタになりません。初期化時は合法的なポインタを指すか、NULLを指すかです。2.ポインタ変数がfreeまたはdeleteされた後、NULLに設定されていません。それらはポインタの指すメモリをリリースしただけですが、針自体を消していません。普通は文if(p!=NULL)はエラー防止処理を行う。残念ながら、この時点でif文はエラー防止の役割を果たしていません。pがNULLポインタでなくても、合法的なメモリブロックを指していないからです。上記のDEMOはこのような状況です。3.ポインタ操作は変数の作用範囲を超えています。ライフサイクルに注意。
【下記はフォーラムのイメージ比喩から抜粋し、理解を深めます。】CRTのメモリ管理モジュールは執事です。   あなたのプログラムはお客さんです。   管理人はバケツによく合うので、水を入れるのに使います。   Mallocとは「執事、バケツ×個お願いします」という意味です。   管理人はまず、十分なバケツがあるかどうかを見てみます。ないなら、だめだと教えてあげます。足りたら、これらのバケツを登録してもう使われました。「使ってください」と言ってください。   freeとは「執事は使い終わったら返します。」という意味です。   水をきれいにしてから、管理人にあげるということは自分のことですか?クリアですか   管理人もあなたが返したバケツを全部干しません。どうせ他のものは自分で処理します。   freeの後で針を点検して自分だけに注意して、これらの水筒はすでに私のではありませんて、更に中を終えて水を入れないでください。   freeの後にその針を使うと、執事が他の人に飲み物を入れてくれたかもしれませんが、中におしっこをしました。良い執事はあなたの行為に対して強い不満を示すかもしれません。あなたを殺しました。いくつかの悪い執事は忙しくて手が回らないかもしれません。時にはあなたを捕まえて悪いことをしたらあなたを処罰します。時にはそこに行くことを知らないことがあります。いずれにしても、この場合は尿を飲む人がいるかもしれません。あなたの社長かそれともお客様か分かりません。   だから、いい市民はもちろん執事にあげるものを返さないでください。