Вероятно, что new
в C ++ безопаснее , чем malloc()
, но это автоматически не делает malloc()
более небезопасным, чем это было раньше. Ваш друг сказал, почему он считает это небезопасным?
Однако вот несколько вещей, на которые следует обратить внимание:
1) С C ++ вам нужно быть осторожным, когда вы используете malloc()
/ free()
и new
/ delete
рядом в та же программа. Это возможно и допустимо, но все, что было выделено с malloc()
, должно быть освобождено с free()
, а не с delete
. Точно так же все, что было выделено с new
, должно быть освобождено с delete
, и никогда с free()
. (Эта логика идет еще дальше: если вы выделяете массив с new[]
, вы должны освободить его с помощью delete[]
, а не только с delete
.) Всегда используйте соответствующие аналоги для выделения и освобождения для каждого объекта.
int* ni = new int;
free(ni); // ERROR: don't do this!
delete ni; // OK
int* mi = (int*)malloc(sizeof(int));
delete mi; // ERROR!
free(mi); // OK
2) malloc()
и new
(опять-таки о C ++) не делают одно и то же. malloc()
просто дает вам часть памяти для использования; new
дополнительно вызовет конструктор (если имеется). Точно так же delete
вызовет деструктор (если доступно), а free()
- нет. Это может привести к проблемам, таким как неправильно инициализированные объекты (потому что конструктор не был вызван) или неосвобожденные ресурсы (потому что деструктор не был вызван).
3) C ++ new
также позаботится о выделении нужного объема памяти для указанного типа, в то время как вам нужно вычислить это самостоятельно с помощью malloc()
:
int *ni = new int;
int *mi = (int*)malloc(sizeof(int)); // required amount of memory must be
// explicitly specified!
// (in some situations, you can make this
// a little safer against code changes by
// writing sizeof(*mi) instead.)
Вывод:
В C ++ new
/ delete
должно быть предпочтительнее, чем malloc()
/ free()
, где это возможно. (В C new
/ delete
недоступно, поэтому выбор будет очевиден.)