对不起,如果这对您来说太基本。但是,我想知道为什么从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