迭代器:如果' *'返回元素的引用,为什么delete *(myList.end())给出了SegFault

时间:2017-11-23 01:53:06

标签: c++ iterator segmentation-fault

很抱歉,如果这对你来说太基础了。但是,我想知道为什么要从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;
}

1 个答案:

答案 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

参考:cppreference.com