C++11 使用std::一元函数清除指针的std::vector
在他的“有效STL”中,Meyers展示了如何正确地清理指针向量(C++11 使用std::一元函数清除指针的std::vector,c++11,vector,stl,destructor,unary-function,C++11,Vector,Stl,Destructor,Unary Function,在他的“有效STL”中,Meyers展示了如何正确地清理指针向量(std::vector::clear只删除他的指针,而不删除它们占用的内存) 因此,他建议在调用clear之前,使用for_each和调用对象析构函数的一元函数: template<typename T> struct DeleteMyObject2: public std::unary_function<const T*, void> { void operator()(const T* ptr)
std::vector::clear
只删除他的指针,而不删除它们占用的内存)
因此,他建议在调用clear
之前,使用for_each
和调用对象析构函数的一元函数:
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();
}
无论如何,如果为DeleteMyObject 2
调用operator()
,但在vec.clear()
之前,vector中的对象不是空的,它就会编译。我假设,由于STL容器一直复制它们的元素,ImageSelection
指针通过值传递,所以一切正常(问题2:我是否正确?)
我试着按ref传递指针,现在每个的后面的对象都是空的,我觉得更安全
template<> struct DeleteMyObject1<algotest::ImageSelection>
{
void operator()(algotest::ImageSelection*& ptr)
{
delete ptr;
ptr=0;
}
};
模板结构DeleteMyObject 1
{
void运算符()(algotest::ImageSelection*&ptr)
{
删除ptr;
ptr=0;
}
};
问题3:deleteMoObject2
是否比deleteMoObject1
更可取,因为它没有不必要的赋值
提前感谢。自从有效的STL问世以来,有了更简短、可读性更强的方法。例如,您现在可以编写
vector<int *> a{new int{1}, new int{2}};
for_each(begin(a), end(a), [](int *p){delete p;});
向量a{newint{1},newint{2};
对于每个(开始(a),结束(a),[](int*p){删除p;});
其中,[](int*p){delete p;}
是一种对delete
anyp
的说法,其代码比问题中的任何一个类都要短得多
作为一个旁白,您可能还需要考虑一个智能指针的<代码>向量<代码>(例如,对于整数指针的代码>矢量< /代码>)。释放资源的显式代码容易出错
关于你的问题:
该类应该用括号显示,用括号表示需要该类的(默认构造的)对象。函数需要对象,而不是类
可以按值传递指针(在本例中)
vector<int *> a{new int{1}, new int{2}};
for_each(begin(a), end(a), [](int *p){delete p;});