calloc
в основном эквивалентен malloc
с последующим memset
, чтобы установить все данные на нулевые байты:
void *like_calloc(size_t size, size_t num) {
void *ret = malloc(size * num);
if (ret)
memset(ret, 0, size * num);
return ret;
}
С ++ обеспечивает синтаксис new
, что позволяет сделать это несколько проще:
int *count = new int[256]();
Обратите внимание на паренс в конце. Также обратите внимание, однако, что вы обычно делаете не хотите сделать это в C++ вообще - вы обычно хотите, чтобы написать код что-то вроде этого:
std::vector<int> getCharCountArray(unsigned char const *str) {
std::vector<int> count(std::numeric_limits<unsigned char>::max()+1);
for (int i=0; str[i]; i++)
++count[str[i]];
return count;
}
Это, очевидно, упрощает код изрядное количество , но есть больше упрощения, чем может быть сразу же очевидно. В частности, это позволяет избежать остальной части кода, который должен отслеживать, когда возвращаемое значение больше не требуется, и удаление памяти в этой точке (но не раньше), как это необходимо либо с версией C, либо с версией, использующей new
в C++.
Зачем вам использовать 'malloc' AND' new'? Это альтернативные способы выделения памяти, вы не используете их вместе. –
@BenVoigt +1 и вы НЕ МОЖЕТЕ НЕ «освобождать» память, выделенную «новым»! –
Я знаю, что malloc и новые разные. Я хочу знать, как выделить этот кусок кода с помощью malloc, а также использовать новый. – nathan1138