newで生成したクラス配列を1つだけ解放する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
イレイサー

newで生成したクラス配列を1つだけ解放する方法

#1

投稿記事 by イレイサー » 14年前

過去ログ検索でも該当項目が見つからなかったので質問させて戴きました。

動的に生成したクラス配列の中で、1つだけ開放したいのですが、良い方法があれば教えて下さい。

文章がへたで済みませんけども、例えば、
ClassA *abc;
abc = new ClassA[20];
と確保した後に、abc[5]だけ開放し、abc[0]~[4]、[6]~[19]だけ残したいような状況です。

単純に、
ClassA *xyz;
xyz = new ClassA[20];
と、生成し、そこに一旦全て内容をコピーし、
delete [] abc;
abc = new ClassA[19];
で生成した所に必要な物だけ戻すような方法は思いつくのですが、
なんだかスマートな方法ではないように思ってしまいます。
もっと良い方法は有りますでしょうか?

もしあるようであればご教授戴ければと思います。
よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: newで生成したクラス配列を1つだけ解放する方法

#2

投稿記事 by softya(ソフト屋) » 14年前

STLのvectorを使えばerase()で部分eraseが可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

イレイサー

Re: newで生成したクラス配列を1つだけ解放する方法

#3

投稿記事 by イレイサー » 14年前

>STLのvectorを使えばerase()で部分eraseが可能です。

存在を知りませんでした。
解説をざっと見た感じでこれで行けそうですので、やってみます。

素早い回答有難う御座いました。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: newで生成したクラス配列を1つだけ解放する方法

#4

投稿記事 by beatle » 14年前

補足です。
C++の話なら、
new ClassA[20]
で生成されるのは、ClassAのインスタンスが20個並んだ配列です。

しかしC#なんかだと、クラスはデフォルトで参照型ですから、new ClassA[20]とするとClassAへの参照(本質的にはポインタ)が20個並んだ配列になります。
したがって
for (int i = 0; i < 20; ++i) abc = new ClassA();
のような処理が必要となります(後述するように、これはC++では出来ない記述ですからご注意ください)。

C++ならクラスは値型ですから、abcはClassAのインスタンスそのもの(参照やポインタではない)が20個並んだ配列ですから、C#のように配列の要素1つずつに対してnewする必要もありませんし出来ません。
同様に、要素1つずつをdeleteすることもできないのです。ポインタではないのですから。
C#のように、クラスのインスタンスへの参照が並んだような配列を作りたいなら、ポインタの配列を作ります。
ClassA** abcptr;
abcptr = new ClassA*[20];
for (int i = 0; i < 20; ++i) abcptr = new ClassA();
とすればOKです。

しかしC++を使うならばsoftyaさんの言うとおりstd::vectorを使うのがよいかと思いますが。

イレイサー

Re: newで生成したクラス配列を1つだけ解放する方法

#5

投稿記事 by イレイサー » 14年前

>C++の話なら、

説明不足失礼しました。
C++で組んでました。

>C#のように、クラスのインスタンスへの参照が並んだような配列を作りたいなら、ポインタの配列を作ります。

なるほど!
これなら途中の1つを開放しても、並べ替え等はポインタ参照変えるだけで済むんですね。

これで選択肢が増えました。
現在の仕様に向いている方法を検討してみたいと思います。

細かい解説有難う御座いました。

閉鎖

“C言語何でも質問掲示板” へ戻る