1

私はクラスAを持っています

class A
{
  A();
  ~A();

  DoSomething();
}

次に、オブジェクトと割り当てられたオブジェクトへのポインタを宣言します

A Obj;
A* pObj = &Obj;

DoSomething()内でpObjをNULLに設定していることがわかりました

A::DoSomething()
{ 
    pObj=NULL;
}

したがって、メソッド内で私は自分自身へのポインターを殺しています...そしてこれはクラッシュしていません...

注:debbugerではこれが(Obj const)であることに気づきました。

なぜこれがいかなる種類の破損も引き起こさないのか理解するのに苦労しています。これは安全ではないと思いますが、その影響を本当に理解することはできません。

乾杯

4

4 に答える 4

6

したがって、メソッド内で私は自分自身へのポインターを殺しています...そしてこれはクラッシュしていません...

クラッシュする理由はまったくありません。オブジェクトへの多くのポインタを持つことができます。それらの1つ以上をNULLにリセットしているという事実は、何か悪いことが起こるはずだということを自動的に意味するわけではありません。

注意すべき2つのタイプの問題は次のとおりです。

  1. NULLに設定した後でポインタを逆参照しようとすると、コードの動作が未定義になります(ほとんどの場合、クラッシュします)。
  2. オブジェクトがヒープに割り当てられていて(あなたのオブジェクトは割り当てられていない)、を呼び出さずにオブジェクトへのすべてのポインタをリセットするとdelete、メモリリークが発生します。
于 2013-01-08T11:17:59.363 に答える
2

pObjは、住所が書かれた一枚の紙であると考えてください。この紙を燃やしても、それが「指し示していた」建物はそのまま残ります。オブジェクトへのすべての参照とポインタを削除しても、オブジェクトは自動的に解放されません。

ちなみに、delete this;クラスのメソッド内を呼び出すこともできます。削除後にそのインスタンスのメンバーにアクセスしようとしない限り、このメソッドも機能します。ただし、このソリューションは、本当に必要な場合にのみ使用する必要があります。

ただし、それがインスタンスへの唯一のポインタである場合は、そのインスタンスにアクセスできなくなり、メモリリークが発生することに注意してください。

于 2013-01-08T11:24:01.600 に答える
1

オブジェクトはそのまま残ります。オブジェクトへのポインタが変更されるだけです。問題ない。これが視覚化です:

+---------+
|   Obj   |  <-------- pObj
+---------+

これで、内部で行っているA::DoSomethingのは、上の画像から矢印を削除することだけです。Obj何も起こらなかったかのように続きます。

于 2013-01-08T11:19:53.013 に答える
0

インスタンスの内部からは、変数に格納されているポインターを介してアクセスするのではなく、キーワードpObjでアクセスできる内部の暗黙の定数ポインターを介してアクセスするため、クラッシュしていません(これはその変数ではなく、単なるインスタンスが実際にメモリ内にある場所へのポインタを取得する方法ですが、実際のアプリケーションでは定数ポインタとして動作します)。thisthis

したがって、変数をNULLで上書きしてもpObj、オブジェクトは消えず、オブジェクト内のすべての内部参照は引き続き有効です。これは、定義した変数に依存しないためですが、コンパイラによって直接参照されるように解決されます。インスタンスはメモリ内に配置されます。

于 2013-01-08T11:23:02.953 に答える