私は構造を持っており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
あなたの例では、両方のポインターが同じオブジェクトを指しているため、破棄した後はどちらも有効ではありません。また、最初の例c=b
では、で割り当てたものを解放できなくなるため、自動メモリ リークが発生しますaa * c = new aa
。
また、コンパイルできないため、これは実際のコードでb.usesomefunction
はありません。あなたが意味しb->use..
た。
コードで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;
}