0

私は構造を持っておりaa、そのようなコードを実行しようとしています:

aa * b = new aa;
aa * c = new aa;
c=b;
delete (b);
c.useSomeFunction

cの破壊後にが指すオブジェクトを使用できますbか?

次の場合の同じ質問:

aa * b = new aa;
aa * c ;
c=b;
delete (b);
c.useSomeFunction
4

2 に答える 2

5

あなたの例では、両方のポインターが同じオブジェクトを指しているため、破棄した後はどちらも有効ではありません。また、最初の例c=bでは、で割り当てたものを解放できなくなるため、自動メモリ リークが発生しますaa * c = new aa


また、コンパイルできないため、これは実際のコードでb.usesomefunctionはありません。あなたが意味しb->use..た。

于 2012-07-22T15:34:26.613 に答える
2

コードでan を使用していないため、質問のタイトルは誤解を招きoperator=()ます。組み込み型のポインターのみを割り当てます。

前に指摘したように:

(*c)最初の例では、オブジェクトを削除できなくなるため、ポインターの割り当てによってメモリ リークが発生します。また、 object を削除した後(*b)に ( によって指されたとしても)の関数を呼び出すことはできません。c(*b)

2 番目の例では、メモリ リークは発生しません。プロダクション コードでは、すべてのポインタを で初期化する必要があることに注意してくださいnullptr(*b)また、ここでは、オブジェクトを削除した後の機能にアクセスできません。

関数の呼び出しは、c->useSomeFunction()構文的に正しくする必要があります。

あなたがおそらく望んでいること (そしてタイトルで示唆されていること) は、新しいオブジェクトを作成し、古いオブジェクトの内容をそれに割り当てることです。何かのようなもの:

struct aa {
  aa():x(0),y(0){}
  aa& operator=(const aa& rhs);
  int foo(){return x-y;}
  int x;
  int y;
};

aa& aa::operator=(const aa& rhs){
  if (this == &rhs) {return *this;}
  x = rhs.x; 
  y = rhs.y;
  return *this;
}

int main(){
  aa *b = new aa();
  aa *c = new aa();
  *c = *b;
  delete(b);
  c->foo();
  delete(c);
  return 0;
}
于 2012-07-22T16:07:01.680 に答える