Вектор, функция assign () Undefined Behavior - PullRequest
0 голосов
/ 27 мая 2020

Мне любопытно; is assign () функция в векторе вызывает неопределенное поведение, если мы используем, как показано ниже;

std::vector<unsigned char> vec{0xAB,0xBC,0xCD};
std::vector<unsigned char> vec2{0xAA,0xBB,0xCC};

vec.assign(vec2.begin(),vec2.begin()+ vec.size());

1 Ответ

1 голос
/ 27 мая 2020

vec.size() возвращает размер vec и, поскольку он имеет тот же размер, что и vec2, с вашим кодом нет проблем (кроме некоторой обфускации, конечно). Откуда размер не имеет значения. Если vec.size() == vec2.size() == 3, все следующее будет делать то же самое:

vec.assign(vec2.begin(),vec2.begin()+ vec.size());
vec.assign(vec2.begin(),vec2.begin()+ vec2.size());
vec.assign(vec2.begin(),vec2.begin()+ 3);
auto x = vec2.size();
vec.assign(vec2.begin(),vec2.begin()+ x);
auto y = x + 42;
vec.assign(vec2.begin(),vec2.begin()+ y-42);

Конечно, использование vec.size(), когда вы имеете в виду vec2.size(), «неправильно» в том смысле, что, как только векторы будут иметь другой размер, вы получите undefined поведение для доступа к любому из двух векторов вне пределов.

...