C++11 使用std::一元函数清除指针的std::vector

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)

在他的“有效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);
};

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
any
p
的说法,其代码比问题中的任何一个类都要短得多

作为一个旁白,您可能还需要考虑一个智能指针的<代码>向量<代码>(例如,对于整数指针的代码>矢量< /代码>)。释放资源的显式代码容易出错

关于你的问题:

  • 该类应该用括号显示,用括号表示需要该类的(默认构造的)对象。函数需要对象,而不是类

  • 可以按值传递指针(在本例中)

  • vector<int *> a{new int{1}, new int{2}};
    for_each(begin(a), end(a), [](int *p){delete p;});