【发布时间】:2018-06-19 06:40:38
【问题描述】:
我正在使用以下代码遍历 std::list:
std::cout << "size: " << get_day_entries().size() << "\n";
for (std::list<DayEntry*>::iterator it = get_day_entries().begin(); it != get_day_entries().end(); ++it){
(*it)->print();
if ((*it)->get_date()->compare(*date)){
std::cout << "FOUND: \n";
(*it)->print();
return (*it);
}
}
当列表不为空时,我得到未定义的行为;它似乎超出了列表的末尾。 当列表为空时(size() 返回 0),它仍然进入循环和段错误,因为它是空的。
为什么当它为空时它会迭代到列表中?为什么它似乎超出了界限,而实际上却没有?
get_day_entries() 返回一个std::list<DayEntry*>。
根据其他答案,C++ 标准规定对于空列表begin() == end(),但此代码没有输入空列表的条件:
if (get_day_entries().begin() == get_day_entries().end())
std::cout << "EQUALS\n";
这里是get_day_entries()的代码:
std::list<DayEntry*> get_day_entries(){return m_day_entries;}
【问题讨论】:
-
显示
get_day_entries的定义如果此函数按值返回列表,您将得到段错误,因为临时对象列表被删除,并且您的迭代器无效。