Безопасно ли обращаться к зарезервированной, но не измеренной в памяти памяти `std :: vector`, как к необработанной памяти? - PullRequest
0 голосов
/ 27 июня 2018

Если кто-то хочет выделить блок памяти без инициализации его нулями, безопасно ли делать следующее?

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 ]

0 голосов
/ 27 июня 2018

Если у вас есть постоянная времени компиляции и относительно небольшой размер, вы можете использовать std::array:

std::array<uint8_t,10000> block;

если не использовать сырую память:

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

или после с ++ 14

auto block = std::make_unique<uint8_t[]>( size );
0 голосов
/ 27 июня 2018

Это может быть "безопасно", но вы нарушаете дизайн класса. А в некоторых стандартных библиотеках поддержки C ++ вектор и его итераторы будут вызывать abort() в режиме отладки, поскольку вы нарушили инвариантные утверждения.

Так что не делай этого.

Если вам нужны большие неинициализированные блоки, вы все равно можете использовать new char[size] и unique_ptr

...