很抱歉,如果这对你来说太基础了。但是,我想知道为什么要从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;
}
答案 0 :(得分:3)
因为std::list::end()
返回指向一个超过最后一个元素的迭代器,所以取消引用它会调用UB。并且因为该地址未分配new
,并且不是nullptr
(实际上它包含无效数据),delete
- 它是另一个UB。
delete *(myList.end())
// ^ UB here
要访问第一个或最后一个元素(不是过去一个!! ),请使用front()
或back()
:
delete myList.front();
delete myList.back();
// ^ No dereference here