4

次のコードをご覧ください。

class Node
{
private:
    double x, y;
public:
    Node (double xx, double yy): x(xx), y(yy){}
};

int main()
{
  Node *n1 = new Node(1,1);
  Node *n2 = n1;

  delete n2; 
  n2 = NULL;

  if (n1 != NULL) //Bad test
  {
     delete n1;   //throw an exception
  }
}

同じオブジェクトを指す2つのポインタn1、n2があります。n1ポインタテストを使用してn2が削除されたかどうかを検出したいと思います。ただし、このテストでは例外が発生します。

n1ポインタを使用してオブジェクトが削除されたか(または削除されなかったか)を判断する方法はありますか?

4

3 に答える 3

11

私の知る限り、この状況に対処する一般的な方法は、(たとえば) COM が行うように、参照カウント ポインターを使用することです。Boost には、役立つ shared_ptr テンプレート クラスがあります ( http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/shared_ptr.htm )。

于 2010-05-03T12:43:39.067 に答える
4

いいえ。コード内にはn1、ポイントされたオブジェクトが破棄されたときにポインタに到達してそれを変更する方法はありません。

それが機能するためにNodeは、(たとえば)それへのすべてのポインタのリストを維持する必要があり、ポインタ値をコピーするたびに手動で登録する(つまりメソッドを呼び出す)必要があります。一緒に仕事をするのはかなり苦痛でしょう。

于 2010-05-03T12:39:18.300 に答える
0

オブジェクトがある場合、それはメモリ内のどこかにあります。これは と の両方の値n1ですn2。オブジェクトを削除すると、そのオブジェクトが使用していたメモリが解放され、メモリが無効になります。n1したがって、削除された場合、ポイントするものにはアクセスできません。

カウンターとオブジェクトへのポインターを含むラッパー オブジェクトを作成することをお勧めします。実際のオブジェクトを指す場合は、代わりにラッパーを指す必要があり、オブジェクトを削除する場合は、実際にラッパーでメソッドを呼び出します。

オブジェクトを指す場合は、ラッパーのカウンターを増やして、ラッパーを指す必要があります。オブジェクトを削除する場合は、カウンターを減らし、ラッパーへのポインターを null に設定する必要があります。ラッパーのカウンターがゼロになった場合は、実際のオブジェクトを安全に削除してからラッパーを削除できます。

于 2010-05-03T12:44:24.790 に答える