Почему у С ++ есть отдельный синтаксис для новых и удаления? - PullRequest
4 голосов
/ 18 февраля 2010

Почему это не могут быть просто обычные вызовы функций? Новое по сути:

malloc(sizeof(Foo));
Foo::Foo();

Пока удалить

Foo:~Foo();
free(...);

Так почему new / delete в конечном итоге имеет собственный синтаксис, а не обычные функции?

Ответы [ 5 ]

7 голосов
/ 18 февраля 2010

Вот удар:

Оператор new вызывает функцию operator new(). Аналогично, оператор delete вызывает функцию operator delete() (и аналогично для версий массива).

Так почему это? Поскольку пользователю разрешено переопределять operator new(), но , а не , оператор new (который является ключевым словом). Вы переопределяете operator new() (и удаляете), чтобы определить свой собственный распределитель, однако вы не несете ответственности (или не можете в этом отношении) вызывать соответствующие конструкторы и деструкторы. Эти функции автоматически вызываются компилятором, когда он видит ключевое слово new.

Без этой дихотомии пользователь мог бы переопределить функцию operator new(), но компилятору все равно пришлось бы обрабатывать ее как специальную функцию и вызывать соответствующий конструктор (и) для объекта (ов) создается.

4 голосов
/ 18 февраля 2010

Вы можете перегрузить operator new и operator delete, чтобы обеспечить собственную семантику выделения.Это полезно, когда вы хотите обойти поведение распределителя кучи по умолчанию.Например, если вы выделяете и освобождаете много экземпляров небольшого объекта фиксированного размера, вы можете использовать распределитель пула для управления его памятью.

Наличие new и delete в качестве явных операторовКак и другие операторы, эту гибкость проще выразить с помощью механизма перегрузки операторов C ++.

Для auto объектов в стеке вызовы размещения / конструктора и вызова освобождения / деструктора в основном прозрачны по вашему запросу.:)

3 голосов
/ 18 февраля 2010

'Потому что нет способа обеспечить безопасность типа времени выполнения с помощью функции (malloc () возвращает void *, запомните). Кроме того, C ++ пытается исключить даже малейшие шансы размещения, но неинициализированных объектов, плавающих вокруг. И есть объекты без конструктора по умолчанию - как бы вы передали аргументы конструктора функции? Такая функция потребует слишком много обработки в особом случае; Проще продвигать его до языковой функции. Таким образом оператор новый.

2 голосов
/ 18 февраля 2010

«new / delete» - это ключевые слова на языке C ++ (например, «for» и «while»), тогда как malloc / calloc - это вызовы функций в стандартной библиотеке C (например, «printf» и «sleep»).Очень разные звери, больше, чем их похожий синтаксис может позволить.

Основное отличие состоит в том, что 'new' и 'delete' запускают дополнительный пользовательский код - в частности, конструкторы и деструкторы.Все, что делает malloc - это выделение некоторой памяти для использования.При выделении памяти для простых простых старых данных (например, float или ints), «new» и «malloc» ведут себя очень схожим образом.Но когда вы запрашиваете место для класса, ключевое слово «new» выделяет память, а затем вызывает конструктор для инициализации этого класса.Большая разница.

1 голос
/ 18 февраля 2010

Почему C ++ имеет отдельный синтаксис для больше чем? Почему это не может быть обычный вызов функции?

greaterThan(foo, bar);
...