2017-06-11 191 views
1

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

在此先感谢。

回答

1

由于有效的STL出来了,还有更短,更易读的方式来做到这一点。例如,你现在可以写

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

其中[](int *p){delete p;}lambda or, anonymous, function说要delete任何p,比无论是在你的问题中的类的更短的代码。另外,您可能还想考虑智能指针的vector(例如,指向整数指针向量的vector<shared_ptr<int>>)。显式解析资源的代码很容易出错。

至于你的问题:

  1. 应该出现带括号,与您指明要这个类的(缺省构造的)对象。该函数需要一个对象,而不是一个类。

  2. 它是精细通过值传递指针(在这种情况下)。

相关问题