2012-05-23 12 views
5

コードは以下の通りである:Cで静的変数と自動変数を解放()できますか?

#include <stdlib.h> 

int num = 3; // Static external variable 
int *ptr = &num; 

int main(void) 
{ 
int num2 = 4; // Automatic variable 
int *ptr2 = &num2; 

free(ptr); //Free static variable 
free(ptr2); //Free automatic variable 

return 0; 
} 

私は上記のコードをコンパイルしようと、それは動作しますが、私は好奇心、静的変数と、自動変数の両方を解放することができfree()機能していますか?基本的には何もしませんか?メモリ割り当て関数(malloccallocなど)によって返されていないポインタにfree()を呼び出す

+1

"作品"の十分に低い品質の定義のために "作品"。また、同じシステムでも、同じコンパイラでも、異なるコンパイルオプションでもクラッシュする可能性があります。それは単に**未定義の動作です** - 何かが起こることがあります。 – Jens

答えて

12

未定義の動作を引き起こします。
コードに未定義の動作があるため、コンパイラは診断を行う必要はなく、動作を示したり、動作したり、クラッシュしたり、文字通り何かを行うことができます。

唯一の解決策は、未定義の動作を引き起こすコードを書くことを避けることです。

+0

NULLポインタ上でfree()を呼び出すこともできます。これは定義された動作です。 *同じ*ポインタに対してfree()を2回呼び出さないようにしてください。 –

+0

私は2回無料にしようとするとどう? – caramel1995

+0

@ caramel23:すべてあなたは未定義の行動であることを保証することができます。 –

5

あなたはそうしてはいけません。 freeは、mallocファミリの関数群によってヒープから動的に割り当てられたメモリにのみ使用されます。

メモリnumは、データセグメントに静的に割り当てられ、解放することはできません。 num2のメモリはmainのコールスタックフレームに割り当てられ、mainが返されるとすぐに解放されます。

実際にはfreeの実装によって異なります。通常、ヒープ内に保持されている特定のデータ構造があり、malloc/freeは、割り当てられた空きメモリ領域を追跡します。 freeは、これらのデータ構造がその引数が指す場所のどこかにあることを期待しています。 malloc割り振りされたヒープ領域を指していないポインタを渡すと、ガーベジ・データが有益な情報とみなされ、奇妙なことが起こります。結果がただちにプログラムがクラッシュした場合、あなたはラッキーです。

関連する問題