2017-06-11 148 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. 它是精細通過值傳遞指針(在這種情況下)。

相關問題