3

私はOOPを学んでいますが、この質問に出くわしました:

これを行う場合:

A* a = new A;

オペレーターはヒープからnew変数用のスペースを見つけます。aその変数が置かれているアドレスを知りたいです。

質問1

その住所はどちらですか?この2つの違いは何ですか?

cout <<  a;
cout << &a;

質問 2 (メイン)

私はポインターをしていない と仮定しましょう。deleteプログラムが終了します。ポインターがクラスのデストラクタによって破壊されていない限り、プログラムを再度実行したときに、そのアドレス (例: 0x0035fa24) を使用してそのオブジェクトを取得できますか? はいの場合、どのように?

4

5 に答える 5

3

質問1

そのアドレスはどれですか?この2つの違いは何ですか?

aオブジェクトのアドレスです。ポインタ&aのアドレスです。

質問2(メイン)

ポインタを削除しないと仮定しましょう。プログラムは終了します。ポインタがクラスのデストラクタによって破棄されていない限り、プログラムを再度実行したときに、そのアドレス(0x0035fa24など)を使用してポインタを取り戻すことはできますか?はいの場合、どのように?

一般的な最新のOSでは、これを行うことはできません。最初のプロセスが終了すると、メモリが再利用されます。これは重大なセキュリティリスクとなるため、その後に開始されるプロセスは、最初のプロセスのメモリの内容を表示できません。

于 2013-02-05T20:19:25.217 に答える
2

Q1:

オペレーターはヒープからnew変数用のスペースを見つけますa

いいえ、そうではありません。演算子は、タイプのnewオブジェクトを作成しますA。次に、変数aはそのアドレスで初期化されます。

したがって、aオブジェクトが存在するアドレスに評価されます。

&a変数aのアドレスに評価されます。

Q2:技術的には、その動作は定義されていません(存在しないオブジェクトへのポインターを逆参照します)。実際には、答えは「いいえ」です。オペレーティングシステムは、終了時にプロセスのすべてのメモリの割り当てを解除します。

于 2013-02-05T20:18:50.633 に答える
1

質問1:

変数aはポインターです。取得すると、のインスタンスが格納され&aているアドレスではなく、ポインタ自体のアドレスが得られます。class A

質問2:

いいえ、それはできません。自分でそのようなリストを維持しない限り、マシンが維持する「Aの場合のすべてのインスタンスのリスト」はありません。

于 2013-02-05T20:19:38.463 に答える
1

1への回答:aアドレスになります。&演算子は、後で書き込んだもののアドレスを返します。平易な英語で&aは、ポインタのアドレスを提供aし、変数によって格納されたアドレスでありa*aによってポイントされたアドレスの内容ですa

2については、理論的には可能ですが、実際には不可能だと思います。

于 2013-02-05T20:20:11.183 に答える
1
A* a = new A;
cout <<  a;
cout << &a;

上記のコードスニペットでは、ヒープ上に新しいAを作成し、そのアドレスをに割り当てています。次に、の値を出力します。これは、動的に作成されたオブジェクトのアドレスです。次に、(スタック上の)ポインター自体のアドレスを出力します。

いいえ、セッション間で失われたメモリを取り戻すことは絶対にできません。

于 2013-02-05T20:20:24.077 に答える