У меня есть объект Holder с этими тремя функциямиудаление unique_ptr объекта из вектора значения атрибута
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, как показано ниже:
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 и работает без каких-либо проблем. Если я изменяю значение размера вектора на два или 0 CPPUNIT_ASSERT (objects.size() == 2); Затем тест не удался. Так кажется, что функция remove сохраняет один из unique_ptr, но превращает его в nullptr? Любая проблема в том, что это проблема?
Ваш итератор "объект" после этого строка не действительна: objects.erase (std :: remove (objects.begin(), objects.end(), * object)); Это делает строку «return std :: move (* object)»; вызывает неопределенное поведение и все испортит. – Gene