2016-11-10 11 views
0

Следующий код работает без сброса ошибки сбоя segemntation. Однако вызов vec.erase стирает последний элемент, то есть удаляет «указатель 1», уменьшает размер vec на один и оставляет «указатель 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

вы не можете стереть «конец» из вектора, потому что он ссылается на элемент, который прошел мимо последнего. Я бы предположил, что это неопределенное поведение. – user463035818

+0

Я знаю, я делаю это в этом примере нарочно. Я был удивлен, что неопределенное поведение отличается в зависимости от содержимого вектора, а не от самого контейнера. – SamVanDonut

+0

Вот почему они назвали его «неопределенным», если вы получите предсказуемое поведение, его можно определить – user463035818

ответ

2

Тот же код с только INT генерирует ошибку ошибки сегментации, как и ожидалось.

Ваши ожидания ошибочны. Неопределенное поведение не гарантирует, что ваша программа потерпит крах. Это может быть сюрпризом для вас, но поведение не определено.

+0

Я был удивлен, что неопределенное поведение отличается в зависимости от содержимого вектора, а не от самого контейнера. – SamVanDonut