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



对不起,如果这对您来说太基本。但是,我想知道为什么从std ::列表中删除方法,方法'end()'用操作员'*',给出分段故障。

[注意代码bellow :我带来了这个想法,因为这篇文章]

请检查我的示例,以便您可以轻松理解我的意思。

#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;
}

,因为 std::list::end()返回一个迭代器,该迭代器指向一个超过了最后一个元素的迭代器,因此将其调用ub。而且由于该地址未分配给new,而且它不是nullptr(实际上它包含无效的数据),所以delete -ing是另一个UB。

delete *(myList.end())
//     ^ UB here

要访问第一个或最后一个元素(不是一past-the-last !! ),使用front()back()

delete myList.front();
delete myList.back();
//     ^ No dereference here

参考:cppreference.com

相关内容

最新更新