下面这个C++程序为什么会崩溃?

bandaoyu 2018-11-14 08:34:31

下面这个段C++程序会在cout << "before: p == " << *p << endl; 处崩溃。搞不懂为什么,

照理std的 find 定义应该和下面这个差不多:

template <class InputIterator, class T>

InputIterator find(

InputIterator first, InputIterator last, const T& value) {

while (first != last && *first != value) ++first;

return first;

}



也就是find即使找不到也会返回last 不就是最后一个元素吗? 不为空吧



代码:

list<int> iList;

list<int>::iterator p =

find(iList.begin(), iList.end(), 2);


cout << "before: p == " << *p << endl;

advance(p, 2); // same as p = p + 2;

cout << "after : p == " << *p << endl;



int k = 0;

distance(p, iList.end(), k);

cout << "k == " << k << endl;
...全文
618 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
fohoo 2018-12-19
  • 打赏
  • 举报
回复
list<int>::iterator p 需要判断不为end 才能*p,谁告诉你find即使找不到也返回最后一个的??
zgbzsu2008 2018-12-18
  • 打赏
  • 举报
回复
引用 13 楼 huojinmeng 的回复:
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
正解
胖·罗 2018-12-05
  • 打赏
  • 举报
回复
vs2017和qt环境下编写C++程序实现动作程序
zhouxiaofeng1021 2018-12-04
  • 打赏
  • 举报
回复
while (first != last && *first != value) ++first; 我觉得这里有问题吧 我觉得说的有道理
引用 14 楼 林多 的回复:
find找不到的话,不是返回最后一个元素。。而是最后一个元素之后的位置。。该位置,不指向任何有意义的内容。 比如 std::vector类型,如果find找不到。。返回的是 std::vector::end()。。它代表是的 past-the-end element。。 英文如下: The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced. 大体意思就是说。。 past-the-end element是一个理论上的Element,它在最后一个实际Element之后。它不指向任何一个Element,不要去引用内容。
lin5161678 2018-12-01
  • 打赏
  • 举报
回复
引用 19 楼 mirro 的回复:
栈内存容量不足导致的
不是
end 本身不能 *
mirro 2018-12-01
  • 打赏
  • 举报
回复
栈内存容量不足导致的
zhouqunhai 2018-11-26
  • 打赏
  • 举报
回复
个人感觉是内存越界了
leekingly 2018-11-24
  • 打赏
  • 举报
回复
引用 14 楼 林多 的回复:
find找不到的话,不是返回最后一个元素。。而是最后一个元素之后的位置。。该位置,不指向任何有意义的内容。

比如 std::vector类型,如果find找不到。。返回的是 std::vector::end()。。它代表是的 past-the-end element。。
英文如下:
The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.

大体意思就是说。。 past-the-end element是一个理论上的Element,它在最后一个实际Element之后。它不指向任何一个Element,不要去引用内容。


学习了
bandaoyu 2018-11-24
  • 打赏
  • 举报
回复
引用 14 楼 林多 的回复:
find找不到的话,不是返回最后一个元素。。而是最后一个元素之后的位置。。该位置,不指向任何有意义的内容。

比如 std::vector类型,如果find找不到。。返回的是 std::vector::end()。。它代表是的 past-the-end element。。
英文如下:
The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.

大体意思就是说。。 past-the-end element是一个理论上的Element,它在最后一个实际Element之后。它不指向任何一个Element,不要去引用内容。
所噶!!! 原来如此,原来std::vector::end()代表是的 past-the-end element。
yshuise 2018-11-23
  • 打赏
  • 举报
回复
你的iList为空哈,从哪儿来的?
林多 2018-11-23
  • 打赏
  • 举报
回复
find找不到的话,不是返回最后一个元素。。而是最后一个元素之后的位置。。该位置,不指向任何有意义的内容。

比如 std::vector类型,如果find找不到。。返回的是 std::vector::end()。。它代表是的 past-the-end element。。
英文如下:
The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.

大体意思就是说。。 past-the-end element是一个理论上的Element,它在最后一个实际Element之后。它不指向任何一个Element,不要去引用内容。
三多兄 2018-11-23
  • 打赏
  • 举报
回复
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last) {
if (*first==val) return first;
++first;
}
return last;
}
feengg 2018-11-22
  • 打赏
  • 举报
回复
11楼说得很清楚了,建议看一下list的用法
Alico131 2018-11-17
  • 打赏
  • 举报
回复
首先你的接口find传入的是容器的迭代器,返回的也是迭代器,list.end() 指向容器最后一个元素的下一个元素(只是一个说法,它并不指向容器中的任何一个元素!list.end()这样设计只是方便循环处理),while (first != last && *first != value) ++first; 仔细看这个实现 当传入的value和容器中元素不匹配时,*first != value一直成立,直到判断完容器最后一个元素,此时再执行++first,迭代器first即== list.end(),表达式 first != last && *first != value 不成立,直接跳出循环(不会再判断*first != value,因为表达式已是false),返回的first就是list.end(),此时对迭代器解引用会崩溃,这个和容器中是否有元素没有关系,容器为空时find接口会直接返回,循环不执行!
英雄@末路 2018-11-16
  • 打赏
  • 举报
回复
引用 7 楼 bandaoyu 的回复:
引用 4 楼 hjwang77 的回复:
加一个非空判断很难么?
认真讨论 不抖机灵

那换个说法,谁给你的信心你的end不为空呢?
领域灬alone 2018-11-16
  • 打赏
  • 举报
回复
while (first != last && *first != value) ++first;

++first:你偏移的是地址;
*first:你是解引用;
那么问题来了,当first是无效地址,你*first会发生什么,建议调试观察内存。
xueyu人生 2018-11-16
  • 打赏
  • 举报
回复
引用 6 楼 bandaoyu 的回复:
[quote=引用 3 楼 zaokang5603 的回复:]
[quote=引用 2 楼 zaokang5603 的回复:]
这个应该是内存越界,定义了list,但没有数据放入,还没有内存分配,我记得这个容器是动态分配,具体详细忘记了!
你填个数据试试

迭代器的end指向最后元素的下一个迭代器,当没查找到时,p这个迭代器并不存在,*P输出必然会出错[/quote]



问题是find的定义是下面这个也会挂,下面这个的话是一个教程上模仿find实现的,可以看到即使找不到也不会返回NULL,而是返回最后一个last

template <class InputIterator, class T>

InputIterator find(

InputIterator first, InputIterator last, const T& value) {

while (first != last && *first != value) ++first;

return first;

}[/quote]
好多年没看c++了
不过last指的估计不是最后的一个元素,而是最后一个元素的下个迭代器,你想想,如果指的最后一个元素,那么他在查找过程中,就不会遍历最后一个元素的,因此last指的是最后一个元素的下个迭代器,而这个迭代器不存在,所以 *p就会出错
bandaoyu 2018-11-15
  • 打赏
  • 举报
回复
引用 4 楼 hjwang77 的回复:
加一个非空判断很难么?
认真讨论 不抖机灵
bandaoyu 2018-11-15
  • 打赏
  • 举报
回复
引用 3 楼 zaokang5603 的回复:
[quote=引用 2 楼 zaokang5603 的回复:]
这个应该是内存越界,定义了list,但没有数据放入,还没有内存分配,我记得这个容器是动态分配,具体详细忘记了!
你填个数据试试

迭代器的end指向最后元素的下一个迭代器,当没查找到时,p这个迭代器并不存在,*P输出必然会出错[/quote]



问题是find的定义是下面这个也会挂,下面这个的话是一个教程上模仿find实现的,可以看到即使找不到也不会返回NULL,而是返回最后一个last

template <class InputIterator, class T>

InputIterator find(

InputIterator first, InputIterator last, const T& value) {

while (first != last && *first != value) ++first;

return first;

}
bandaoyu 2018-11-15
  • 打赏
  • 举报
回复
引用 2 楼 zaokang5603 的回复:
这个应该是内存越界,定义了list,但没有数据放入,还没有内存分配,我记得这个容器是动态分配,具体详细忘记了!
你填个数据试试
我试过填数据,最后还是崩溃了
加载更多回复(4)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧