2012-05-20 66 views
1

我班有一個指針向量:升壓ptr_vector處理去除「引用」

ptr_vector<Class> vec; 

而在一些「設置」方法,增加了一些類向量:中

void setupOrSomething() 
{ 
    vec.push_back(new Class(...)); 
    .... 
} 

現在客戶這個類可能希望自己的類對象添加到這個列表類:

void addThingToMyList(Class *cPointer) 
{ 
    vec.push_back(cPointer); 
} 

他們可能希望通過傳遞噸至刪除他同一個指針:

void removeThingFromMyList(Class *cPointer) { ... } 

現在,如果我理解正確,閱讀這個答案(https://stackoverflow.com/a/357043/48998)後,我需要實現方法如下:

void removeThingFromMyList(Class *cPointer) 
{ 
    vec.release(std::find_if(vec.begin(),vec.end(),CheckPointerValue(cPointer)).release(); 
} 

struct CheckPointerValue 
{ 
    CheckPointerValue(Class* c):cptr(c) {} 
    bool operator()(Class const& X) { return &X == cptr;} 
    private: 
     Class* cptr; 
}; 

我明白我必須也呼籲釋放( )第二次在從ptr_vector.release()返回的auto_ptr上。

我是否正確假設這將確保此方法的調用方(RemoveThing ...)將保留對其Class對象的有效引用並且它不會被刪除?我只是想讓vec獲得臨時所有權,然後放棄它。

回答

1

是的,他們會保留一個指向有效實例的指針。當然,他們需要知道指針首先引用了一個有效的實例,並且指向該實例的指針存儲在向量中。如果不是,你會得到未定義的行爲,可能是一個seg故障。