为什么擦除 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.
你的期望是错误的。未定义的行为不保证您的程序会崩溃。这可能会让您感到惊讶,但行为是不确定的。
以下代码运行时不会引发分段错误。但是,对 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.
你的期望是错误的。未定义的行为不保证您的程序会崩溃。这可能会让您感到惊讶,但行为是不确定的。