我有这三个功能通过属性值
unique_ptr<Object> Holder::remove(string objName){
std::vector<unique_ptr<Object>>::iterator object =
find_if(objects.begin(), objects.end(),
[&](unique_ptr<Object> & obj){ return obj->name() == objName;}
);
objects.erase(std::remove(objects.begin(), objects.end(), *object));
return std::move(*object);
}
vector<unique_ptr<Object>> const& Holder::getContent() const {
return this->objects;
}
void Holder::add(unique_ptr<Object> objPtr) {
this->objects.push_back(move(objPtr));
}
我已经写了如下一个CppUnit的测试一个Holder对象中除去来自矢量的对象的的unique_ptr:
void HolderTest::removeObject() {
Holder holder("bag");
unique_ptr<Object> ringPtr(new Object("a"));
holder.add(move(ringPtr));
unique_ptr<Object> swordPtr(new Object("b"));
holder.add(move(swordPtr));
holder.remove("a");
vector<unique_ptr<Object>> const& objects = holder.getContent();
CPPUNIT_ASSERT(objects.size() == 1);
}
该测试是通过没有问题,但对我来说很奇怪的是,如果我加入下面的行:
const std::string name = objects[0].get()->name();
CPPUNIT_ASSERT_EQUALS("b", name);
然后测试崩溃,没有任何消息。我在另一个测试中写了这条线,没有调用remove,并且它没有任何问题。 如果我将矢量大小的值更改为2或0 CPPUNIT_ASSERT(objects.size()== 2); 然后测试失败。所以看来,删除功能是保持其中一个unique_ptr,但它把它变成一个nullptr? 任何iea有什么问题?
你的迭代器 “对象” 是在此之后行无效:objects.erase(std :: remove(objects.begin(),objects.end(),* object));这使得该行“返回std :: move(* object);”导致未定义的行为和搞乱一切。 – Gene