彼の "Effective STL" Meyersには、ポインタのベクトルを正しく消去する方法が示されています(std::vector::clear
はポインタだけを削除し、占有するメモリは削除しません)。std :: unary_functionでポインタのベクトルをクリアする
そこで彼は、オブジェクトのデストラクタを呼び出しunary_functionとclear
使用for_each
への呼び出しの前にアドバイス:?なぜました:書籍DeleteMyObject2
で
template<typename T> struct DeleteMyObject2: public std::unary_function<const T*, void>
{
void operator()(const T* ptr);
};
template<> struct DeleteMyObject2<algotest::ImageSelection>
{
void operator()(const algotest::ImageSelection* ptr)
{
delete ptr;
ptr=0; // this was added by me
}
};
void std_clearing_pointers()
{
std::vector<ImageSelection*> vec;
vec.reserve(5);
for(int i=0; i<5; ++i)
vec.insert(vec.begin(), new ImageSelection());
std::for_each(vec.begin(), vec.end(), DeleteMyObject2<ImageSelection>());
// HERE elements of vec are not NULL !!!
vec.clear();
}
は括弧なしで呼ばれていた、それは(question1をコンパイルしていません標準的な変更は):?
std::for_each(vec.begin(), vec.end(), DeleteMyObject2<ImageSelection>);
とにかく、それはDeleteMyObject2
のためであれば、コールoperator()
をコンパイルしますが、前vec.clear()
ベクトルのオブジェクトはNULLではありません。私は、STLコンテナが常にその要素をコピーするので、ポインタが値渡されるので、すべてが問題ないと思います(question2:私は正しいですか?)
私はrefでポインタを渡そうとしましたが、オブジェクトはfor_each
の後にNULLになりました。私はより安全だと感じました。
template<> struct DeleteMyObject1<algotest::ImageSelection>
{
void operator()(algotest::ImageSelection*& ptr)
{
delete ptr;
ptr=0;
}
};
question3:それは不必要な割り当てをしていないためDeleteMyObject1
よりDeleteMyObject2
より好ましいですか?
ありがとうございます。