2016-03-20 28 views
2

私は明らかにdeleteを使って何かを誤解しました。 なぜこのプログラムは私の記憶を満たしていますか?メモリ解放C++

void f(int* x){ 
    x = new int[42]; 
} 

int main(){ 
    while(true){ 
     int* x; 
     f(x); 
     delete[] x; 
    } 
    return 0; 
} 

どのように私は私がmain関数内からfに割り当てられたメモリを解放することができますか?

答えて

4

実際には、外部機能の変数xは変更されていません。

int* f(){ 
    return new int[42]; 
} 

int main(){ 
    while(true){ 
     int* x = f(); 
     delete[] x; 
    } 
    return 0; 
} 

または参照で変数xを渡す::、あなたがfの戻り値に依存するか持っていることを行うには

void f(int*& x){ 
    x = new int[42]; 
} 

int main(){ 
    while(true){ 
     int* x; 
     f(x); 
     delete[] x; 
    } 
    return 0; 
} 

それともとしてポインタへのポインタを使用しますf引数:

void f(int** x){ 
    *x = new int[42]; 
} 

int main(){ 
    while(true){ 
     int* x; 
     f(&x); 
     delete[] x; 
    } 
    return 0; 
} 

のように...

1

参照によってパラメータを渡します。あなたは価値によってそれを渡しています。

2

は機能

void f(int* x){ 
    x = new int[42]; 
} 

あなたはメモリを割り当てますが、それは決して自由でメモリリークがあります。関数パラメータは、関数のローカル変数です。この関数は、元のポインタのコピーを扱います。コピーの変更は元の議論に影響しません。

そして、ポインタxが初期化されていないため、mpreoverプログラムに未定義の動作があります。

int main(){ 
    while(true){ 
     int* x; 
     ^^^^^^ 
     f(x); 
     delete[] x; 
    } 
    return 0; 
} 

元のポインタを参照渡しする必要があります。だから、この関数は

void f(int* &x){ 
    x = new int[42]; 
} 

のように定義されており、だから、あなたが何をしたいかもしれません

f(x); 

または

void f(int* *x){ 
    *x = new int[42]; 
} 

のように定義されており、

f(&x); 
-1

のように呼ばれるように呼ばれるべきdoは、fuを構築することを検討することですRAIIを使用するnctor/class/struct ...

これは、標準ライブラリが多くの割り当てをどのように処理するかを意味します。あなたの特定の機能については

struct A { 
A(){/*allocate mem*/} 
~A(){/*deallocate mem*/} 
} 

void f(int** x); 

は、ほとんどあなたが欲しい署名です。これにより、配列へのポインタで配列を変更することができます。しかし...私はまだこれをしないことをお勧めします...あなたは配列の束を割り当てることを決めた場合、理由は何ですか?メインメソッドはメモリの割り当てを解除する責任がありますか?

関連する問題