2

「pnValue は動的に割り当てられた整数のアドレスを保持する唯一の変数であるため、pnValue が破棄されると、動的に割り当てられたメモリへの参照はなくなります。これをメモリリークと呼びます。その結果、動的に割り当てられた整数は削除できないため、再割り当てや再利用はできません。」{LearnCpp から引用。}

pnValue が動的に割り当てられた整数のアドレスを保持するのはなぜですか? ポインターが単にアドレスを指している場合、ポインターを破棄するとアドレスに影響するのはなぜですか? これは、動的に割り当てられた整数では、ポインターが何らかの形でアドレスであるため、常にポインターが必要であることを意味しますか?

4

5 に答える 5

5

定義されたすべてのオブジェクトはメモリに存在し、アドレスを持っています。オブジェクトのアドレスは、オブジェクトが存在し始める場所からのメモリの場所です。したがって、1次元のメモリ空間では、オブジェクトがスロット100に存在し始めると、100がオブジェクトのアドレスであると言われます。

 99 100 101  102  103  104  105  106
=====================================
   | O  | B  | J  | E  | C  | T  |    
=====================================
     ^
     |
     |
 pnObject

ポインタは、他のオブジェクトのアドレスを含むオブジェクトです。オブジェクトを動的に作成すると、そのオブジェクトはヒープメモリに作成され、スコープはありません。割り当てられたメモリを明示的に削除しない限り、またはメモリを割り当てているプログラムが停止する限り、存在し続けます。

メモリは、c-library関数mallocまたはc++演算子を介して動的に割り当てられます。演算子newは、オブジェクトが存在し始めるヒープメモリ内の開始位置であるアドレスを返します。アドレスを変数(ポインタと呼ばれる特定のタイプ)に保存することになっています。この変数は、オブジェクトのアドレスを保持します。

Object *pnValue = new Object();

ヒープ内に新しく作成されたオブジェクトのアドレスを知っている限り、制御できますが、ポインター変数を破棄するか、コンテンツをオーバーレイするか、単にアドレスを保存しないなどしてアドレスを忘れると、その場所にアクセスして先に進むことはできません。割り当てられたメモリを解放/削除できません。

 99 100 101  102  103  104  105  106
=====================================
   | O  | B  | J  | E  | C  | T  |    
=====================================
于 2013-01-09T18:18:34.310 に答える
4

ポインターは「アドレスを指すだけ」です。これが言っているのは、そのアドレスを指すすべてのポインターを削除すると、そこに格納されているメモリに「到達」して削除/解放する方法がないということです。その場所を指すポインタがなくなるとすぐに、そのメモリをクリーンアップする方法がなくなるため、リークが発生します。

ポインタを破棄してもリークは発生しません - クリーンアップするためにメモリに到達するために使用できる別のポインタがある場合。ポインタを破棄すると、他のポインタが保持されていない場合、そのメモリにアクセスできなくなります。

于 2013-01-09T18:04:09.647 に答える
2

ポインターはアドレスを指すのではなく、アドレスを格納します。それらはオブジェクトを「指す」と言われています。それらが指すオブジェクトは、それらが保存するアドレスにあるオブジェクトです。

アドレス帳を考えてみてください。各エントリは、友達の 1 人へのポインターです (友達はオブジェクトです)。あなたの友達が全国に散らばっていて(あなたのコンピュータのメモリ)、あなたの記憶ががらくたと仮定してください。そのため、友達を見つけるにはアドレス帳が必要です。アドレス帳のページを失うと (ポインタが壊れる)、そのページにアドレスがあった友人は失われます。つまり、バックアップ コピー (同じアドレスを保持するポインターが他にもある) がない限りです。

于 2013-01-09T18:06:21.757 に答える
1

pnValueが動的に割り当てられた整数のアドレスを保持するのはなぜですか?ポインタがアドレスを指しているだけの場合、ポインタを破棄するとアドレスに影響するのはなぜですか?

「アドレス」という用語の2つの異なる使用法に混乱しています。この単語は、場所を見つける方法に関する情報を指す場合と、場所自体を指す場合の両方に使用できます。検討:

1)住所を一枚の紙に書きました。

2)私は今その住所に車で行きます。

最初の意味を使用して、ポインタはアドレスを格納します。特定のデータまたはメモリを見つける方法に関する情報。他の意味を使用すると、ポインターはアドレスを指します。それらはデータまたはメモリの場所を指します。一枚の紙に住所(場所への行き方に関する情報)を書くのと同じように、その一枚の紙は住所(場所)を指すようになります。

したがって、ポインタを破棄すると、その場所にアクセスする方法に関する情報が破棄されます。

これは、動的に割り当てられた整数では、ポインターが何らかの形でアドレスであるため、常にポインターが必要であることを意味しますか?

を使用してメモリを割り当てるnewと、割り当てられたメモリにアクセスする方法に関する情報が提供されます。リークとは、最終的に同じ情報をに戻さなかった場合に発生することですdelete。そうです、最終的にに返すことができるように、常に何らかの方法でその情報を維持する必要がありますdelete

于 2013-01-09T18:39:23.370 に答える
1

ベンジャミンが言ったように、ポインタはアクセスしたいデータのアドレスを保存します。ポインタを作成する場合は、必要なメモリ量も予約する必要があります。そうしないと、簡単にアクセス違反を作成できます。また、メモリ リークは、アプリケーションの仮想空間が増加するために煩わしいだけでなく、ポインターの不適切な処理も、アプリケーションやシステムに侵入しようとするすべての人にとって良い入り口になることを認識しておく必要があります。メモリ リークを見つけるために、@codeproject.com のようなプロジェクトがいくつかあります: http://www.codeproject.com/Articles/9815/Visual-Leak-Detector-Enhanced-Memory-Leak-Detectio

于 2013-01-09T18:30:00.160 に答える