Вы предоставляете пустое std::vector
в качестве пункта назначения при вызове std::copy()
, следовательно, оно будет потенциально слишком маленьким, чтобы соответствовать исходным данным, и поэтому вы получите неопределенное поведение . Чтобы решить это непосредственно, вам нужно передать std::back_inserter
в качестве 3-го аргумента std::copy()
. Таким образом, он будет добавляться к std::vector
при копировании в него, таким образом гарантируя, что он будет иметь правильный размер - как показано в примере здесь внизу .
Сказав, что, если все, что вам нужно, это скопировать содержимое файла в std::vector
, то это будет широко используемый и широко рекомендуемый шаблон, использующий 4-ю перегрузку здесь :
auto loadimg(std::ifstream &file) {
std::vector<unsigned char> img_data(
std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>());
return img_data;
}
Это правильно сформировано как первый аргумент, данный конструктору (тип std::istreambuf_iterator
) удовлетворяет LegacyInputIterator
. 2-й аргумент - это построенный по умолчанию std::istreambuf_iterator
, который удобно использовать в качестве end
итератора этого или любого такого потока.