私のプログラミングのバックグラウンドはJavaの世界ですが、C++の学習を始めたばかりです。私はこのかなり些細でおそらくかなりお粗末な問題に出くわしました。それはどういうわけかJavaプログラマーとして私を困惑させます。
コンストラクタでnewを介して初期化され、デストラクタで削除される配列を持つクラスがあります。このクラスのオブジェクトを作成し、このクラスの別のオブジェクトを同じ変数に割り当てると(少なくともそれは私が思うことです)、変数が離れるときにデストラクタのdelete[]メソッドが2回呼び出されるようです。スコープ(この場合はmain()関数)(デバッガーは_BLOCK_TYPE_IS_VALIDアサーション失敗の警告を表示します)。
何故ですか?新しいオブジェクトをfに割り当てる前に、デコンストラクタが呼び出されないのはなぜですか?Foo(1)を明示的に削除するにはどうすればよいですか?ここで正確に何が起こりますか?
class Foo{
private:
int *field;
public:
Foo(int size){
field = new int[size];
}
~Foo(){
delete[] field;
}
};
int main(){
Foo f = Foo(1);
f = Foo(2);
}