ページ 11

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

Posted: 2012年5月13日(日) 23:34
by イレイサー
過去ログ検索でも該当項目が見つからなかったので質問させて戴きました。

動的に生成したクラス配列の中で、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];
で生成した所に必要な物だけ戻すような方法は思いつくのですが、
なんだかスマートな方法ではないように思ってしまいます。
もっと良い方法は有りますでしょうか?

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

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

Posted: 2012年5月13日(日) 23:49
by softya(ソフト屋)
STLのvectorを使えばerase()で部分eraseが可能です。

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

Posted: 2012年5月13日(日) 23:58
by イレイサー
>STLのvectorを使えばerase()で部分eraseが可能です。

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

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

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

Posted: 2012年5月14日(月) 07:31
by beatle
補足です。
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つだけ解放する方法

Posted: 2012年5月14日(月) 20:23
by イレイサー
>C++の話なら、

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

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

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

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

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