8

コードは次のとおりです。

#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()関数で静的変数と自動変数の両方を解放できるのでしょうか?それとも基本的に何もしませんか?

4

2 に答える 2

21

メモリ割り当て関数 (など) によってfree()返されないポインタを呼び出すとmallocUndefined Behaviorが発生します。 あなたのコードには未定義の動作があるため、コンパイラはそれを診断する必要はなく、任意の動作を表示できます。動作するか、クラッシュするか、文字通り何でもします。 calloc

未定義の動作を引き起こすコードを書かないようにすることが唯一の解決策です。

于 2012-05-23T08:16:26.490 に答える
5

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

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

実際に何が起こるかは、の実装に依存しますfree。通常、割り当てられたメモリ領域と解放されたメモリ領域を支援malloc/追跡するために、特定のデータ構造がヒープに保持されます。これらのデータ構造は、引数が指している場所のどこかにあると予想されます。割り当てられたヒープ領域を指していないポインターを渡すと、ガベージデータが有用な情報と見なされ、奇妙なことが起こります。そして、結果がただちにプログラムがクラッシュするだけならラッキーです。freefreemalloc

于 2012-05-23T08:16:27.457 に答える