配列のdelete – プログラミング – Home

通知
すべてクリア

[解決済] 配列のdelete


たけ
 たけ
(@たけ)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

配列の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;
としなくてはならないのでしょうか?

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


引用未解決
トピックタグ
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

>この場合はforループでX=new A* [10];
>で獲得したメモリーは全て解放されているのでしょうか?
されません。

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

私は、newした回数だけdeleteする習慣にしています。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

>X=new A* [10];
これって『A*の配列』を確保しちゃってるから、

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

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

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

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


返信引用
たけ
 たけ
(@たけ)
ゲスト
結合: 23年前
投稿: 3
Topic starter  

くたくた様、sugar様、PAI様、ありがとうございました。
仕組みが分かって納得です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました