代码之家  ›  专栏  ›  技术社区  ›  Museful

是否可以安全地访问“std::vector”作为原始内存保留但不在内存中调整大小?

  •  0
  • Museful  · 技术社区  · 8 年前

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

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

    如果没有,有没有比 malloc free 是吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Slava    8 年前

    如果您有编译时间常数和相对较小的大小,可以使用 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 );
    
        2
  •  3
  •   Zan Lynx    8 年前

    它可能是“安全的”,但你打破了课堂设计。在一些标准的c++支持库中,向量及其迭代器将调用 abort() 在调试模式下,因为您违反了不变断言。

    所以不要这么做。

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