Вот здесь предоставлен прототип оператора new :
void* operator new (std::size_t size);
Но почему он используется с помощью совсем другого синтаксиса, например:
int *a = new int;
Т.е. почему не пишутся круглые скобки и за место sizeof(TYPE)
просто TYPE
?
Использование оператора new
обладает специальными свойствами. Когда он используется непосредственно как оператор в составе выражения (new expression
), как в вашем примере:
int* a = new int;
то компилятор делает три вещи:
void* operator new (std::size_t size);
для выделения памяти под создаваемый объектОднако можно явно использовать непосредственно саму функцию operator new
для выделения куска неинициализированной памяти:
void * p = ::operator new(sizeof(int));
Тут никакой магии нет, это обычный вызов функции.
Стоить отметить, что большинство других операторов также можно вызывать "как операторы" и "как функции", например:
struct MyStruct;
bool operator ==(MyStruct const & left, MyStruct const & right);
MyStruct x;
MyStruct y
if(x == y) // синтаксис оператора
if(::operator ==(x, y)) // синтаксис функции
потому что у оператора new
много способов использования.
Вот это вариант:
int* a = new int;
выделяет память из кучи и инициализирует объект, вызывая какой-нибудь конструктор.
Этот вариант:
void* operator new (std::size_t size);
только выделяет память и возвращает указатель на эту область не инициализуруя объект, подобно тому как работает функция malloc
из языка С.
Update
Перевожу специально для вас из того ресурса:
MyClass * p1 = new MyClass;
// выделяет память вызывая operator new (sizeof(MyClass))
// затем строит объект в этой области памяти
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Как задать в С++ d OpenCV 3 ROI треугольной или трапециевидной формы?
Подскажите, пожалуйста, синтаксис, как инициализировать вектор типа
Не работает дружественный класс (ошибка в функции show)Как организовать доступ к классу Teacher?
У меня почему-то программа не видит ArrayПодскажите в чем ошибка и как правильно реализовать вычитание элемента от матрицы?