配列のnew&deleteの質問です。
Class A{
....
};
というクラスがあるとして、
void main(){
A **X:
X=new A* [10];
X[0]=new A;
X[1]=new A;
X[3]=new A;
:
:
X[9]=new A;
delete [] X;
}
という関数を作ります。
このとき私の意図としては
delete [] X;
でclass Aのデストラクターが10回実行されることを期待したのですが、
実際に試してみるとデストラクターが実行されなかったので、
結局
delete [] X;
という行を
for(int i=0;i<10;i++){
delete X[i];
}
に変更したのですが、この場合はforループで
X=new A* [10];
で獲得したメモリーは全て解放されているのでしょうか?
それとも
for(int i=0;i<10;i++){
delete X[i];
}
delete [] X;
としなくてはならないのでしょうか?
どうすればよいかご存知の方はどうか教えてください。
よろしくおねがいします。
>この場合はforループでX=new A* [10];
>で獲得したメモリーは全て解放されているのでしょうか?
されません。
>for(int i=0;i<10;i++){
> delete X[i];
>}
>delete [] X;
>としなくてはならないのでしょうか?
そうです。STLを使える状況なら、vector等を使う事で楽になると思います。
私は、newした回数だけdeleteする習慣にしています。
>X=new A* [10];
これって『A*の配列』を確保しちゃってるから、
>delete [] X;
も『A*の配列』を削除するだけです。
動的に確保したポインタの配列に、それぞれ動的に確保したオブジェクトを持たせているので
両方削除してやらなければいけません。
くたくたさんの言うようにstd::vectorを使用すると楽になります。
オブジェクトがポリモーフィックでないならvector<A>としてAの配列を確保し、
オブジェクトがポリモーフィックな時はvector<A*>としてポインタを確保します。
後者は中身は自分でそれぞれnew,deleteする必要がありますが。
くたくた様、sugar様、PAI様、ありがとうございました。
仕組みが分かって納得です。