Вопрос по fread, c++, resize, vector – std :: vector resize против резерва во время фреда

0

Это мой рабочий код:

size_t FileReader::Read(ByteVector& output)
{
    output.resize(m_elementSize * m_blockSize);
    size_t read = fread(&output[0], m_elementSize, m_blockSize, m_file);
    output.resize(read);
    return read;
}

Однако предыдущий я попробовал код, который имелoutput.reserve(m_elementSize * m_blockSize);

Насколько я знаюreserve просто находит место в памяти для контейнера.resize сделайте то же самое, также измените память из корзины в некоторые заданные значения и измените размер контейнера.

fread первый параметрvoid * и это так же, какunsigned char *, мой вопрос, почему я получил исключение во время звонка.fread

Почему это происходит? Так какfread принимает указатель void и не записывает в память, используяvector учебный класс.

Постскриптум забыл упомянутьtypedef std::vector ByteVector

Ваш Ответ

2   ответа
1

за работой

Я хотел избежать ненужногоresize потому что он работает с данными в памяти, однако послеreserve output[0] не существует

Что еще после прочтенияvector размер будет равен нулю иresize уничтожит прочитанные данные.

resize победил'ничего не делать, если вы передаете ему текущий размер вектора, так что вашif не нужно Alan Stokes
Вы правы. ST3
4

output[0] вызывает неопределенное поведение (независимо от того, сколько места вы зарезервировали), и на некоторых платформах это может вызвать исключение.

Почему это вызывает UB? ST3
Нету. Это's эквивалентно * (output.begin ()), что включает в себя разыменование за пределами конечного итератора, который всегда неопределенное поведение. Разрешено выбрасывать исключение (но тогда и все остальное), и абсолютно ничего не требуется. Ты можешь позвонитьoutput.at(0) если вы хотите исключение. Alan Stokes
Если вектор пуст, он нене имеет нулевого элемента. Попытка доступа к несуществующему элементу является UB. Alan Stokes
Не уверен, но я думаю, что это всегда должно вызывать исключение, нене так ли? ST3

Похожие вопросы