C++ 访问“std::vector”和#x27是否安全;保留但未在内存中调整大小,作为原始内存?
如果要分配内存块而不将其初始化为零,那么执行以下操作是否安全C++ 访问“std::vector”和#x27是否安全;保留但未在内存中调整大小,作为原始内存?,c++,memory-management,c++14,stdvector,C++,Memory Management,C++14,Stdvector,如果要分配内存块而不将其初始化为零,那么执行以下操作是否安全 std::vector<uint8_t> block(0); block.reserve(10000000); // now access block.data()[0] through block.data()[9999999] as raw uninitialized memory std::向量块(0); 区块储备(10000000); //现在通过block.data()[999999]访问block.data(
std::vector<uint8_t> block(0);
block.reserve(10000000);
// now access block.data()[0] through block.data()[9999999] as raw uninitialized memory
std::向量块(0);
区块储备(10000000);
//现在通过block.data()[999999]访问block.data()[0]作为原始未初始化内存
如果没有,是否有比malloc
和free
更适合这项工作的工具?它可能是“安全的”,但您正在破坏类设计。在一些标准的C++支持库中,向量和它的迭代器将在调试模式下调用<代码>异常()/代码>,因为您违反了不变的断言。
所以不要这样做
如果您只需要较大的未初始化块,您仍然可以使用
new char[size]
和unique\u ptr
如果您有编译时常量和相对较小的大小,您可以使用std::array
:
std::array<uint8_t,10000> block;
std::数组块;
如果不使用原始内存:
std::unique_ptr<uint8_t[]> block( new uint8_t[size] );
std::唯一ptr块(新uint8_t[size]);
或者在c++14之后
auto block = std::make_unique<uint8_t[]>( size );
auto block=std::使_唯一(大小);
@Slavastd::array
在堆栈上,不会new char[]
初始化内存?初始化嵌入类型不需要new
,但在开发环境中malloc
可以这样做,所以使用它与new
不会new char[]相比,您不会赢得任何东西
初始化内存?@Museful据我所知不是。基元类型和POD类型不会自动初始化。@不,它不会初始化内存(或者至少,没有保证)。注意:分配大量内存通常会让新手感到困惑,因为它看起来像是被设置为零。但这不是C或C++的保证;这是因为C支持库(msvcrt或glibc)从操作系统请求一个新的内存块。由于安全原因,它被设置为全零。考虑使用STD::MaxIOxIONE替代您的代码。@ AdvSype不幸地不能使用<代码> MaxIOxION/<代码>带数组。@斯拉瓦下面的代码是有效的:<代码> STD::UnQuyY-PTR块{STD::MaMaIO唯一(size)};<我一直认为std::make_unque
不适用于数组,你总能学到一些新的、更新的东西