配列のdelete

[戻る]
たけ [E-Mail] 2002/11/20(水) 16:57:18
配列の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;
としなくてはならないのでしょうか?

どうすればよいかご存知の方はどうか教えてください。
よろしくおねがいします。

くたくた 2002/11/20(水) 17:19:59
>この場合はforループでX=new A* [10];
>で獲得したメモリーは全て解放されているのでしょうか?
されません。

>for(int i=0;i<10;i++){
> delete X[i];
>}
>delete [] X;
>としなくてはならないのでしょうか?
そうです。STLを使える状況なら、vector等を使う事で楽になると思います。

sugar 2002/11/20(水) 17:38:05
私は、newした回数だけdeleteする習慣にしています。

PAI 2002/11/21(木) 12:31:12
>X=new A* [10];
これって『A*の配列』を確保しちゃってるから、

>delete [] X;
も『A*の配列』を削除するだけです。


動的に確保したポインタの配列に、それぞれ動的に確保したオブジェクトを持たせているので
両方削除してやらなければいけません。

くたくたさんの言うようにstd::vectorを使用すると楽になります。

オブジェクトがポリモーフィックでないならvector<A>としてAの配列を確保し、
オブジェクトがポリモーフィックな時はvector<A*>としてポインタを確保します。 
後者は中身は自分でそれぞれnew,deleteする必要がありますが。

たけ [E-Mail] 2002/11/21(木) 19:34:58
[[解決]]
くたくた様、sugar様、PAI様、ありがとうございました。
仕組みが分かって納得です。

古いスレッドには追加発言できません。