为什么擦除End-Iterator不会给shared_ptr分段错误

Why does erasing End-Iterator not give Segmentation Fault with shared_ptr?

本文关键字:ptr 分段 错误 shared 擦除 End-Iterator 为什么      更新时间:2023-10-16

以下代码运行时不会抛出分段错误错误。然而,对vec.erase的调用会擦除最后一个元素,即删除"指针1",将vec的大小减小1,并留下"指针0"。

std::vector<std::shared_ptr<int>> vec;
vec.push_back(std::make_shared<int>(0));
vec.push_back(std::make_shared<int>(1));
vec.erase(vec.end());
std::cout << vec.size() << std::endl

与int相同的代码抛出分段错误,如预期的那样。

这背后的原因是什么?

PS:测试GCC 5.2.1

与int相同的代码抛出分段错误,如预期的那样。

你的期望是错误的。未定义行为不能保证您的程序会崩溃。这对你来说可能是一个惊喜,但行为是不确定的。