【发布时间】:2017-11-13 05:05:36
【问题描述】:
在他的“Effective STL”中,Meyers 展示了如何正确清理指针向量(std::vector::clear 只删除他的指针,而不是它们占用的内存)。
所以他建议在调用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>);
无论如何,如果为DeleteMyObject2 调用operator(),它会编译,但在vector 中的vec.clear() 对象之前不是NULL。我想随着 STL 容器一直在复制它们的元素,ImageSelection 指针是按值传递的,所以一切正常(question2:我说的对吗?)。
我尝试通过 ref 传递指针,现在对象在for_each 之后为 NULL,我觉得更安全。
template<> struct DeleteMyObject1<algotest::ImageSelection>
{
void operator()(algotest::ImageSelection*& ptr)
{
delete ptr;
ptr=0;
}
};
question3:DeleteMyObject2 是否比DeleteMyObject1 更可取,因为它没有不必要的分配?
提前致谢。
【问题讨论】:
标签: c++11 vector stl destructor unary-function