在他的“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
,因为它具有不不必要指定?
在此先感谢。