Я, як правило, намагаюся по-різному сформулювати речі, щоб розрізнити обидва, але це питання добре в будь-якому випадку.
Operator new - це функція, яка виділяє необроблену пам'ять - принаймні концептуально, вона не сильно відрізняється від malloc()
. Хоча це досить незвично, якщо ви не пишете щось на зразок власного контейнера, ви можете зателефонувати безпосередньо новому оператору, наприклад:
char *x = static_cast<char *>(operator new(100));
Можливо також перевантажити нового оператора або глобально, або для конкретного класу. IIRC, підпис:
void *operator new(size_t);
Звичайно, якщо ви перевантажуєте нового оператора (глобального або для класу), вам також буде потрібно / перевантажити видалення відповідного оператора. Для того, що варто, є також окремий оператор new [], який використовується для розподілу пам'яті для масивів - але вам майже напевно краще повністю ігнорувати весь цей безлад.
Новий оператор - це те, що ви зазвичай використовуєте для створення об'єкта з безкоштовного магазину:
my_class *x = new my_class(0);
Різниця між ними полягає в тому, що оператор new просто виділяє необроблену пам'ять, нічого іншого. Новий оператор починає з використання оператора new для розподілу пам'яті, але потім він викликає конструктор для потрібного типу об’єкта, тому результат - це реальний живий об'єкт, створений у цій пам'яті. Якщо цей об'єкт містить будь-які інші об'єкти (вбудовані або як базові класи), ці конструктори також викликаються.