访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?

Is it safe to access a `std::vector`'s reserved but not sized-in memory, as raw memory?

本文关键字:内存 原始 是否 安全 调整 vector std 保留 访问      更新时间:2023-10-16

如果要分配内存块而不将其初始化为零,执行以下操作是否安全?

std::vector<uint8_t> block(0);
block.reserve(10000000);
// now access block.data()[0] through block.data()[9999999] as raw uninitialized memory

如果没有,是否有比mallocfree更新的工具

如果你有编译时常数和相对较小的大小,你可以使用std::array

std::array<uint8_t,10000> block;

如果不使用原始内存:

std::unique_ptr<uint8_t[]> block( new uint8_t[size] );

或 C++14 之后

auto block = std::make_unique<uint8_t[]>( size );

它可能是"安全的",但你正在破坏类设计。在某些标准C++支持库中,向量及其迭代器将在调试模式下调用abort(),因为您违反了不变断言。

所以不要这样做。

如果你只想要大的未初始化块,你仍然可以使用new char[size]unique_ptr