В этом вопросе есть некоторая двусмысленность.
int *ip1 = malloc(sizeof int);
int *ip2 = new int;
Эти два фактически делают одно и то же: создают неинициализированное значение в куче и присваивают его адрес указателю слевасторона.
Но:
struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = new S;
Эти двое не обязательно делают одно и то же.Если S
имеет конструктор, new S
выделит память и вызовет конструктор ;malloc(sizeof S)
будет выделять только память.
Я упомянул неоднозначность.Есть и другое возможное значение для «замены new
», при котором используются вызовы operator new
:
struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = ::operator new(sizeof S);
На первый взгляд, по умолчанию эти два делают одно и то же: они выделяют память в кучеобъект типа S
и возвращает указатель на эту память; ни один не инициализирует объект. Но есть важное отличие. Если malloc
не может выделить память, он возвращает нулевой указатель. Если operator new
не может выделитьпамяти он выдает исключение типа std::bad_alloc
(это еще не все, но на данный момент этого достаточно).
Это также верно для new S
: он выдает исключение, если не может выделитьпамяти, в то время как malloc
возвращает нулевой указатель.