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

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

以下代码运行时不会引发分段错误。但是,对 vec.erase 的调用会删除最后一个元素,即删除 "pointer 1",将 vec 的大小减少一个并留下 "pointer 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 测试

The same code with just int throws a segmentation fault error, as expected.

你的期望是错误的。未定义的行为不保证您的程序会崩溃。这可能会让您感到惊讶,但行为是不确定的。