Название говорит об этом.
Я пытался:
new char[nSize];
но он может вернуть неинициализированную память.
где as calloc
обеспечивает нулевую инициализацию.
Я мог бы вызвать memset и т. д., но нет ли более прямого пути?
std::vector<char>
будет инициализирован нулем.
И убедитесь, что вы используете delete []
для освобождения. std::vector
было бы лучше.
используйте std::string
или std::vector<char>
Возможно, вы захотите подумать о том, почему вам нужна нулевая инициализация. Я не помню, чтобы мне это когда-нибудь понадобилось.
Вектор @FrançoisAndrieux обычно подойдет - если только мне не нужно им владеть - что я и делаю здесь. Так что не универсальное решение.
Что ты имеешь в виду под "владеть им"?
Обратите внимание, что большое выделение calloc
обычно оптимизируется операционной системой (она предварительно выделяет нулевые страницы и копирует при записи). Так что это может быть намного быстрее, чем любая из возможных замен.
Если calloc
действительно то, что вам нужно, что мешает вам просто использовать std::calloc
?
@MichaelKenzel Мне нужно изменить распределение кучи для поиска ошибок кучи (используя VirtualAlloc и его друзей) - и это нелегко сделать с помощью calloc - если вообще возможно.
What's the most suitable c++ replacement of calloc?
Для большинства целей std::vector
. Или std::string
, если вы собираетесь представлять строку символов. Он автоматически удалит любую память, которую он выделяет.
Для структур данных, которые содержат много массивов, которые не являются взаимно смежными, вы можете избежать размера немного большего, чем указатель std::vector
, и вместо этого можете выбрать уникальный указатель:
auto ptr = std::make_unique<char[]>(nSize);
Вы также можете использовать инициализацию значения с новым выражением. Вот что std::make_unique
делает внутри:
new char[nSize]();
Но я бы не рекомендовал выделения без контейнера RAII.
Как упоминалось в Геза, calloc
может быть оптимизирован (в некоторых системах) таким образом, что он может исключать установку памяти на ноль при выделении большого блока. Если такая оптимизация применима к вашему случаю и является измеримо значимой, то может быть аргумент в пользу использования std::calloc
в C++.
new char[nSize]{};
инициализируется нулем.