【发布时间】:2018-05-06 21:12:35
【问题描述】:
对不起,如果这对您来说太基本了。但是,我想知道为什么从 std::list 中删除带有运算符 '*' 的方法返回的 'end()' 会给出分段故障。
[下面代码的注释:我有这个想法是因为this post]
请查看我的示例,以便您轻松理解我的意思。
#include <list>
#include <memory>
int main(int argc, char const *argv[])
{
std::list<int*> myList;
int *ptr1 = new int(1) , *ptr2 = new int(2);
myList.push_back( ptr1 );
myList.push_back( ptr2 );
delete myList.back(); // !!<< this one is ok
//delete *(myList.end()); // !!<< but, this gives segmentation fault
return 0;
}
【问题讨论】:
-
end()返回一个在列表末尾之后的迭代器。它超出了范围,因此请自行承担取消引用它的风险。 -
你的意思是什么时候结束,是不是因为列表是用哨兵实现的?
-
好问题。没有好的答案。据我所知,它只有一个
nullptr。这是end上的可靠文档页面:en.cppreference.com/w/cpp/container/list/end。考虑将back()用于您正在做的事情。
标签: c++ iterator segmentation-fault