std :: vector在fread期间调整大小vs reserve

时间:2013-08-21 12:28:49

标签: c++ vector resize fread

这是我的工作代码:

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类写入内存。

P.S。忘了提及typedef std::vector<unsigned char> ByteVector

2 个答案:

答案 0 :(得分:4)

如果向量最初为空,则output[0]将调用未定义的行为(无论您保留多少空间),并且在某些平台上它可能会抛出异常。

答案 1 :(得分:1)

找到了问题,现在我使用的代码叫做 working

我希望避免使用不必要的resize,因为它适用于内存中的数据,但是在reserve output[0]不存在之后。

读取vector后的大小将为零,resize会破坏读取数据。