Разница между "новым оператором" и "оператором нового"?

В чем разница между "новым оператором" и "оператором нового"?

Ответ 1

Я обычно пытаюсь разыгрывать вещи по-другому, чтобы лучше различать два, но это хороший вопрос в любом случае.

Оператор new - это функция, которая выделяет необработанную память - по крайней мере, концептуально, она не сильно отличается от malloc(). Хотя это довольно необычно, если вы не пишете что-то вроде своего собственного контейнера, вы можете напрямую вызвать оператора new, например:

char *x = static_cast<char *>(operator new(100));

Также возможно перегрузить оператор new либо глобально, либо для определенного класса. IIRC, подпись:

void *operator new(size_t);

Конечно, если вы перегрузите новый оператор (глобальный или для класса), вам также понадобится/нужно будет также перегрузить соответствующий оператор delete. Для этого стоит отдельный оператор new [], который используется для выделения памяти для массивов - но вы почти наверняка лучше игнорируете весь этот беспорядок.

Новый оператор - это то, что вы обычно используете для создания объекта из свободного хранилища:

my_class *x = new my_class(0);

Разница между двумя заключается в том, что оператор new просто выделяет необработанную память, ничего больше. Новый оператор начинает с использования оператора new для выделения памяти, но затем он вызывает конструктор для нужного типа объекта, поэтому результат представляет собой реальный живой объект, созданный в этой памяти. Если этот объект содержит любые другие объекты (как встроенные, так и базовые классы), те вызываемые конструкторы.

Ответ 2

"new"

class Foo
{
public:
        void* operator new( size_t );
}

"новый оператор":

Foo* foo = new Foo();

В этом примере new Foo() вызывает Foo::operator new()

Другими словами, "новый оператор" вызывает "operator new()" так же, как вызовы оператора + operator +()

Ответ 3

Ниже приводится цитата из более эффективной книги С++ от Скотта Мейерса:

Новый оператор вызывает функцию выполнить требуемую память распределения, и вы можете переписать или перегружать эту функцию, чтобы изменить ее поведение. Имя функции новые вызовы оператора для выделения памяти является новым оператором.

Ответ 4

Нет никакой разницы между "новым оператором" и "оператором new". Оба относятся к одной и той же вещи: перегружаемой/заменяемой функции operator new, которая обычно выполняет распределение необработанной памяти для объектов, созданных новыми выражениями.

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

Когда вы используете new в своей программе для создания объекта, он называется new-expression. Новое выражение состоит из ключевого слова new и дополнительных синтаксических частей, определенных грамматикой. Никакая часть синтаксиса выражения никогда не упоминается как "оператор".

Функция выделения необработанной памяти operator new официально называется просто "operator new function". Обратите внимание, что слова operator и new в этой последовательности - всего два отдельных словаря языка С++. Они не образуют английский термин "оператор новый". Нигде в спецификации языка вы не найдете ссылок на "новый оператор" в качестве английского термина. Каждый раз это всего лишь комбинация двух независимых ключевых слов, которые производят синтаксис объявления для функции выделения памяти.

Опять же, в резюме: формально в С++ нет таких терминов на английском языке, как "оператор новый" или "новый оператор". Первая последовательность присутствует в спецификации языка как простая комбинация ключевых слов, а не как английский термин. Последний отсутствует вообще.

Ответ 5

Когда вы создаете новый объект, память выделяется с помощью оператора new, тогда конструктор вызывается для инициализации памяти. новый оператор выполняет как распределение, так и инициализацию, где, поскольку оператор new только выполняет выделение.

Ответ 6

Вопрос OP неправильно сформулирован. Лучше ставить как "Разницу между" оператором нового "и" новым выражением "? Примечание" Оператор new "часто относится к" новой функции оператора".

И есть много правильного ответа, ниже мое:

1 > 'new expression' call 'operator new', чтобы выделить необработанную память, затем вызвать конструктор

apple * p = new apple(); //new expression

2 > "operator new" выделяет только необработанную память, а не большую разницу, чем malloc

void* mem = operator new(sizeof(apple)); //just like calling malloc()
apple* p2 = new(mem) apple(1); //call construct here using placement new.

Ответ 7

Новый оператор: С++ поддерживает динамическое размещение объектов с использованием нового оператора. Новый оператор выделяет память для объектов из пула, называемого свободным хранилищем. Новый оператор вызывает специальный оператор функции new.

оператор new: Если запрос содержит нулевые байты памяти, оператор new возвращает указатель на отдельный объект (т.е. Повторные вызовы оператора new возвращают разные указатели). Если для запроса на распределение недостаточно памяти, оператор new возвращает NULL или генерирует исключение. Первый аргумент для оператора new должен иметь тип size_t (тип, определенный в STDDEF.H), а возвращаемый тип всегда void *.

Ниже приведены ссылки MSDN для более подробной информации:

Оператор new Function

Новый оператор

Ответ 8

  • new - это оператор, а также ключевое слово.

    см. [1] В 2.13 && В 2.12.

  • new делает две вещи: T * t = new T (arg);

    1) выделить память для объекта: void * ptr = operator new (sizeof (T));

    //operator new - это функция (как и malloc в c), а не оператор. (см. [1] В п. 3.7.4). Но в пункте 7 [2] сказано, что это тоже оператор. На мой взгляд, разница между оператором и функцией мала, и вы можете увидеть ее, когда вспомните, что оператор перегрузки реализуется функциями.

    //мы можем перегрузить этот оператор/функцию (оператор new), делая то, что мы хотим только здесь.

    2) инициализировать объект в выделенной памяти: вызвать T:: T (arg) на ptr

    // только компилятор может это сделать. Ни я, ни вы не можете.

    //Также компилятор будет вызывать конструкторы объектов-членов и конструктор базового класса, если у них есть. И этот вызов является рекурсивным. Только компилятор может это сделать.

  • Итак, оператор new выполняет часть миссий нового, и только в этой части мы можем что-то сделать.

    [1]: ISO/IEC, N3690. http://ww.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf

    [2]: Мейерс, Скотт. Эффективный С++, 3rd.