4

私は c++ を初めて使用し、動的メモリとメモリ リークについて学びました。

私が理解していることから、pointer( int *ptr = new int) を作成してから、彼が指しているアドレスを変更すると、古いアドレスがまだ存在/割り当てられています。(私が間違っている場合は修正してください)。

だから私はこれについて考えました:

int *ptr;
ptr = new int;

最初のptrはランダムな(またはそうではない)アドレスで埋められ、次にそれを変更すると、古いアドレスが残りますか?このコードを試してみると:

int *ptr;
cout << ptr << endl ;
ptr = new int;
cout << ptr << endl ;

私は得る:

0x401a4e
0x6d2d20

0x401a4e はメモリ リークの一部ということですか? それとも、ptr が動的メモリに移動するときに解放されますか? それはどのように機能しますか?

4

4 に答える 4

15

メモリ リークはポインタに関するものではないことを理解する必要があります (実際には決してありません。多くの人が別のことを主張しているにもかかわらず)。ポインターを使用したビジネス全体は、誤解を招くだけです。

それらは、動的メモリ割り当てと割り当て解除の不一致に関するものです。

すべての割り当て viaは、正確に 1 つの割り当て解除 vianewと一致する必要があります。and and and (およびその他の考えられる動的リソース割り当て関数)についても同じです。deletemallocfreenew[]delete[]

int* x; // Not a memory leak: no dynamic allocation
new int; // Memory leak: we acquired a value via `new` and lost it.

int* y = new int;
int* z = y;
delete y; // Not a memory leak any more: we freed the memory.

delete z; // Oooh, bad: we deleted a value twice. The horror.

最新の C++ コードでは、手動の動的メモリ割り当てをほとんど使用しません (ほとんどの場合: no )。そうすれば、漏れることはありません。原則として。これは非常に良いので、それを実行してください。手動で動的にメモリを割り当てる代わりに、メモリ管理を処理する標準のコンテナーとスマート ポインターを利用できます。

于 2012-08-08T19:54:28.333 に答える
8

最初の行(int *ptr;)は動的メモリを割り当てないため、メモリリークは発生しません。表示される値は初期化されていません。有効なポインタではありません。ポインタに値を割り当てる前に、ポインタを削除しないでください。そうすることは未定義の振る舞いになります。

于 2012-08-08T19:50:12.020 に答える
1

いいえ、メモリリークではありません。違いは、 ""と言うと、 ;new intを保持するためにメモリのブロックを予約するようにC++に指示していることです。intその後、その予約済みブロックへのポインタを失うと、そのブロックを回復したり解放したりすることができなくなります。したがって、再利用できないため、リークになります。

ポインタ変数にいくつかのビットを保持するだけでは、魔法は実行されません。それらはほんの少しです。それを使用してメモリを割り当てると、new問題が発生する可能性があります。ブロックを予約したら、それをなくさないように注意する必要があります。

于 2012-08-08T19:51:07.797 に答える
1

C / C ++では、メモリは自動的に解放されません。だから、はい、あなたがこれを行う場合:

 YourType* ptr = new YourType();
 ptr = new YourType();

メモリリークが発生します。

ただし、あなたの場合、最初の値は有効なメモリ位置ではないため、メモリリークは発生しません。初期化されていないポインタです。

于 2012-08-08T19:51:56.777 に答える