Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问“std::vector”和#x27是否安全;保留但未在内存中调整大小,作为原始内存?_C++_Memory Management_C++14_Stdvector - Fatal编程技术网

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::使_唯一(大小);

@Slava
std::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
不适用于数组,你总能学到一些新的、更新的东西