2016-11-10 59 views
0

以下代码运行时未抛出segemntation错误错误。然而,对vec.erase的调用擦除了最后一个元素,即去除“指针1”,将vec的大小减小1,并将“指针0”留下。为什么擦除End-Iterator不会给shared_ptr分段错误?

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

+0

你不能从向量中擦除'end',因为它引用了最后一个元素之后的元素。我猜测这是不确定的行为。 – user463035818

+0

我知道,我在这个例子中是故意的。我很惊讶,未定义的行为取决于向量的内容而不是容器本身。 – SamVanDonut

+0

多数民众赞成他们为什么称它为“未定义”,如果你会得到可预见的行为,可以定义 – user463035818

回答

2

相同的代码只有INT抛出一个分段错误,如预期测试。

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

+0

我很惊讶,未定义的行为取决于向量的内容而不是容器本身。 – SamVanDonut