我有這三個功能通過屬性值
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