Какая наиболее подходящая замена С++ calloc?

Название говорит об этом.

Я пытался:

new char[nSize];

но он может вернуть неинициализированную память. где as calloc обеспечивает нулевую инициализацию.

Я мог бы вызвать memset и т. д., но нет ли более прямого пути?

new char[nSize]{}; инициализируется нулем.
drescherjm 10.04.2019 22:25
std::vector<char> будет инициализирован нулем.
François Andrieux 10.04.2019 22:26

И убедитесь, что вы используете delete [] для освобождения. std::vector было бы лучше.

Fred Larson 10.04.2019 22:26

используйте std::string или std::vector<char>

NathanOliver 10.04.2019 22:28

Возможно, вы захотите подумать о том, почему вам нужна нулевая инициализация. Я не помню, чтобы мне это когда-нибудь понадобилось.

user2100815 10.04.2019 22:28

Вектор @FrançoisAndrieux обычно подойдет - если только мне не нужно им владеть - что я и делаю здесь. Так что не универсальное решение.

darune 10.04.2019 22:40

Что ты имеешь в виду под "владеть им"?

user2100815 10.04.2019 22:43

Обратите внимание, что большое выделение calloc обычно оптимизируется операционной системой (она предварительно выделяет нулевые страницы и копирует при записи). Так что это может быть намного быстрее, чем любая из возможных замен.

geza 10.04.2019 22:59

Если calloc действительно то, что вам нужно, что мешает вам просто использовать std::calloc?

Michael Kenzel 11.04.2019 01:01

@MichaelKenzel Мне нужно изменить распределение кучи для поиска ошибок кучи (используя VirtualAlloc и его друзей) - и это нелегко сделать с помощью calloc - если вообще возможно.

darune 11.04.2019 12:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
10
213
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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++.

Другие вопросы по теме