可変長配列 std::vector でインスタンスのポインタを扱っている場合の削除方法 - C++ プログラミング
PROGRAM
可変長配列 std::vector<T> でインスタンスのポインタを扱っている場合の削除方法
C++ には、可変長の配列を簡単に利用できる std::vector<T> というテンプレートクラスがあります。
その基本的な使い方については 可変長配列 std::vector<T> を使用する で記しましたが、この std::vector<T> でクラスのポインタを扱っている場合、格納したポインタが指すクラスインスタンスの生成や削除は自分で行う必要があります。
最後の要素を取得する場合
とくに気を遣うのは削除のタイミングになると思います。
インスタンスのポインタを扱う std::vector<T> で最後の要素を取り除く pop_back メソッドを使用するときは、その前に最後の要素を削除するようにします。
delete vector.back();
vector.pop_back();
std::vector<T> の pop_back メソッドでは削除される要素は取得できないので、その前に back メソッドを使って最後の要素を取得して、それを delete するという方法になります。
全ての要素を消去する場合
std::for_each とラムダ関数を使う方法
インスタンスのポインタを扱う std::vector<T> の std::vector<T> の clear メソッドを使って全ての要素を削除するような場合は、全ての要素に対して delete を実行する必要があります。
この時、例えば STL の std::for_each 関数と ラムダ関数 を併せて使用すると、次のようにして全ての要素を破棄できます。
std::for_each(vector.begin(), vector.end(), [](CMyClass* p) { delete p; });
vector.clear();
std::for_each 関数を使って vector の最初から最後まで、第 3 引数で指定したラムダ関数を実行しています。
なお、std::for_each は <algorithm> ヘッダーに定義されているので、使用するためにはこのヘッダーファイルをインクルードしておく必要があります。
C++11 の for : 構文を使う方法
Visual Studio 2012 や Xcode 4.5.2 などの環境であれば、C++11 で導入された for : 構文を使って次のように書くこともできます。
for (CMyClass* element : vector)
{
delete element;
}
vector.clear();
やっていることは std::for_each 関数とラムダ関数を使ったときと同じですけど、こちらの方が素直に分りやすく書くことができます。
[ もどる ]