過去ログ検索でも該当項目が見つからなかったので質問させて戴きました。
動的に生成したクラス配列の中で、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];
で生成した所に必要な物だけ戻すような方法は思いつくのですが、
なんだかスマートな方法ではないように思ってしまいます。
もっと良い方法は有りますでしょうか?
もしあるようであればご教授戴ければと思います。
よろしくお願いします。
newで生成したクラス配列を1つだけ解放する方法
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: newで生成したクラス配列を1つだけ解放する方法
STLのvectorを使えばerase()で部分eraseが可能です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
イレイサー
Re: newで生成したクラス配列を1つだけ解放する方法
>STLのvectorを使えばerase()で部分eraseが可能です。
存在を知りませんでした。
解説をざっと見た感じでこれで行けそうですので、やってみます。
素早い回答有難う御座いました。
存在を知りませんでした。
解説をざっと見た感じでこれで行けそうですので、やってみます。
素早い回答有難う御座いました。
Re: newで生成したクラス配列を1つだけ解放する方法
補足です。
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を使うのがよいかと思いますが。
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つだけ解放する方法
>C++の話なら、
説明不足失礼しました。
C++で組んでました。
>C#のように、クラスのインスタンスへの参照が並んだような配列を作りたいなら、ポインタの配列を作ります。
なるほど!
これなら途中の1つを開放しても、並べ替え等はポインタ参照変えるだけで済むんですね。
これで選択肢が増えました。
現在の仕様に向いている方法を検討してみたいと思います。
細かい解説有難う御座いました。
説明不足失礼しました。
C++で組んでました。
>C#のように、クラスのインスタンスへの参照が並んだような配列を作りたいなら、ポインタの配列を作ります。
なるほど!
これなら途中の1つを開放しても、並べ替え等はポインタ参照変えるだけで済むんですね。
これで選択肢が増えました。
現在の仕様に向いている方法を検討してみたいと思います。
細かい解説有難う御座いました。