c++ - standard - whatwg español
std:: vector resize vs reserve during fread (2)
He encontrado el problema, ahora uso el código que llamé trabajo
Quería evitar el cambio de resize
innecesario porque funciona con datos en la memoria, sin embargo, después de la output[0]
reserve
output[0]
no existe.
Lo que es más, después del tamaño del vector
lectura sería cero y el cambio de resize
destruiría los datos leídos.
Este es mi código de trabajo:
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;
}
Sin embargo, anteriormente he probado el código que tenía output.reserve(m_elementSize * m_blockSize);
Por lo que sé, la reserve
solo encuentra un lugar en la memoria para el contenedor. resize
el resize
hacer lo mismo, también cambia la memoria de la basura a algunos valores dados y cambiar el tamaño del contenedor.
fread
primer parámetro de fread
está void *
y es lo mismo que unsigned char *
, mi pregunta, ¿por qué recibí una excepción al llamar a fread
?
¿Por qué está sucediendo? Porque fread
toma el puntero void y no escribe en la memoria usando vector
clase vector
.
PD se olvidó de mencionar typedef std::vector<unsigned char> ByteVector
Si el vector está inicialmente vacío, la output[0]
invoca un comportamiento indefinido (independientemente de la cantidad de espacio que haya reservado), y en algunas plataformas puede arrojar una excepción.