在他的「Effective STL」中,Meyers展示瞭如何正確清除指針的向量(std::vector::clear
只刪除了他的指針,而不是他們佔用的內存)。使用std :: unary_function清除std :: vector指針
於是他調用clear
使用for_each
與unary_function它調用對象的析構之前建議:
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();
}
在書中DeleteMyObject2
被稱爲沒有括號,它不編譯(問題1:爲什麼是標準改變):
std::for_each(vec.begin(), vec.end(), DeleteMyObject2<ImageSelection>);
無論如何,如果編譯調用operator()
爲DeleteMyObject2
,但在此之前vec.clear()
矢量中的對象不是NULL的。我想隨着STL容器一直在複製它們的元素,指針是按值傳遞的,所以一切正常(question2:我是否正確?)。
我試圖通過裁判傳遞指針,現在的對象是空值for_each
後,我感到更安全。
template<> struct DeleteMyObject1<algotest::ImageSelection>
{
void operator()(algotest::ImageSelection*& ptr)
{
delete ptr;
ptr=0;
}
};
問題3:是DeleteMyObject2
更優選大於DeleteMyObject1
,因爲它具有不不必要指定?
在此先感謝。