我的班级有一个指针向量:
ptr_vector<Class> vec;
在某些“setup”方法中,向向量添加了几个类:
void setupOrSomething()
{
vec.push_back(new Class(...));
....
}
现在,此类的客户端可能希望将其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上第二次调用release()。
我是否正确假设这将确保此方法的调用者(RemoveThing ...)将保留对其Class对象的有效引用,并且不会被删除?我只是想让vec获得临时所有权然后放弃它。
答案 0 :(得分:1)
是的,它们将保留指向有效实例的指针。当然,他们需要知道指针首先引用一个有效的实例,并且指向该实例的指针存储在向量中。如果不是,您将得到未定义的行为,可能是段错误。