访问 `std::vector` 的保留但未调整大小的内存作为原始内存是否安全?
Is it safe to access a `std::vector`'s reserved but not sized-in memory, as raw memory?
如果想分配一块内存而不将其初始化为零,执行以下操作是否安全?
std::vector<uint8_t> block(0);
block.reserve(10000000);
// now access block.data()[0] through block.data()[9999999] as raw uninitialized memory
如果没有,是否有比 malloc
和 free
更新的工具来完成这项工作?
它可能是 "safe" 但你破坏了 class 设计。在某些标准 C++ 支持库中,向量及其迭代器将在调试模式下调用 abort()
,因为您违反了不变断言。
所以不要这样做。
如果您只想要未初始化的大块,您仍然可以使用 new char[size]
和 unique_ptr
如果你有编译时间常数和相对较小的尺寸你可以使用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 );
如果想分配一块内存而不将其初始化为零,执行以下操作是否安全?
std::vector<uint8_t> block(0);
block.reserve(10000000);
// now access block.data()[0] through block.data()[9999999] as raw uninitialized memory
如果没有,是否有比 malloc
和 free
更新的工具来完成这项工作?
它可能是 "safe" 但你破坏了 class 设计。在某些标准 C++ 支持库中,向量及其迭代器将在调试模式下调用 abort()
,因为您违反了不变断言。
所以不要这样做。
如果您只想要未初始化的大块,您仍然可以使用 new char[size]
和 unique_ptr
如果你有编译时间常数和相对较小的尺寸你可以使用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 );