¿Diferencia entre ‘nuevo operador’ y ‘operador nuevo’?

¿Cuál es la diferencia entre “nuevo operador” y “operador nuevo”?

Normalmente trato de express las cosas de manera diferente para diferenciarlas un poco mejor, pero en cualquier caso es una buena pregunta.

Operator new es una función que asigna memoria bruta; al menos conceptualmente, no es muy diferente de malloc() . Aunque es bastante inusual a menos que esté escribiendo algo así como su propio contenedor, puede llamar directamente al operador nuevo, como:

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

También es posible sobrecargar al operador nuevo ya sea globalmente o para una clase específica. IIRC, la firma es:

 void *operator new(size_t); 

Por supuesto, si sobrecarga un operador nuevo (ya sea global o para una clase), también querrá / necesitará sobrecargar el operador de coincidencia eliminar también. Por lo que vale, también hay un nuevo operador [] que se utiliza para asignar memoria a las matrices, pero es casi seguro que es mejor ignorar por completo ese desastre.

El nuevo operador es lo que normalmente usa para crear un objeto desde la tienda gratuita:

 my_class *x = new my_class(0); 

La diferencia entre los dos es que el operador nuevo solo asigna memoria bruta, nada más. El nuevo operador comienza utilizando un operador nuevo para asignar memoria, pero luego invoca el constructor para el tipo correcto de objeto, por lo que el resultado es un objeto vivo real creado en esa memoria. Si ese objeto contiene cualquier otro objeto (ya sea incrustado o como clases base) esos constructores también se invocan.

“operador nuevo”

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

“nuevo operador”:

 Foo* foo = new Foo(); 

En este ejemplo, el new Foo() llama a Foo::operator new()

En otras palabras, “nuevo operador” llama ” operator new() ” al igual que el operador + llama al operator +()

A continuación se encuentra la cita del libro C ++ más efectivo de Scott Meyers:

El nuevo operador llama a una función para realizar la asignación de memoria requerida, y usted puede reescribir o sobrecargar esa función para cambiar su comportamiento. El nombre de la función que llama el nuevo operador para asignar memoria es operador nuevo.

No hay diferencia entre “nuevo operador” y “operador nuevo”. Ambos se refieren a lo mismo: la operator new función de operator new reemplazable / reemplazable que normalmente realiza la asignación de memoria bruta para objetos creados por expresiones nuevas .

Tenga en cuenta también que ninguno de los términos está presente en la especificación del lenguaje (que es la fuente de definición de la terminología oficial).

Cuando utiliza new en su progtwig para crear un objeto, se llama nueva expresión . La expresión new consiste en palabras clave new y partes sintácticas adicionales definidas por la gramática. Ninguna parte de la syntax de esta expresión se conoce como “operador”.

El operator new función de asignación de memoria sin formato se denomina oficialmente ” operator new función del operator new “. Tenga en cuenta que las palabras operator y new en esta secuencia son solo dos palabras clave separadas del lenguaje C ++. No forman un término en inglés “operador nuevo”. En ninguna parte de la especificación del lenguaje encontrará referencias a “operador nuevo” como un término en inglés. Cada vez esto es solo una combinación de dos palabras clave independientes que producen una syntax de statement para una función de asignación de memoria.

Nuevamente, en resumen: formalmente en C ++ no existen términos en inglés tales como “operador nuevo” u “nuevo operador”. La secuencia anterior está presente en la especificación del lenguaje como una mera combinación de palabras clave, no como un término en inglés. El último no está presente en absoluto.

Cuando creas un nuevo objeto, la memoria se asigna usando el operador new y luego se invoca el constructor para inicializar la memoria. El nuevo operador hace tanto la asignación como la inicialización, mientras que el operador nuevo solo realiza la asignación.

La pregunta del OP no está redactada correctamente. ¿Es mejor realizar una fase como ‘Diferencia entre’ operador nuevo ‘y’ nueva expresión ‘?’ Note que ‘operador nuevo’ a menudo se refiere a ‘operador nueva función’ también.

Y hay muchas respuestas correctas, debajo está el mío:

1> ‘nueva expresión’ llamada ‘operador nuevo’ para asignar memoria sin procesar, luego llamada al constructor

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

2> ‘operador nuevo’ solo asigna memoria bruta, no hay mucha diferencia que malloc

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

El nuevo operador : C ++ admite la asignación dinámica de objetos utilizando el nuevo operador. El nuevo operador asigna memoria para objetos de un grupo llamado tienda gratuita. El nuevo operador llama al operador de función especial nuevo.

operador nuevo : si la solicitud es de cero bytes de almacenamiento, el operador nuevo devuelve un puntero a un objeto distinto (es decir, llamadas repetidas al operador, nuevos punteros de retorno diferentes). Si no hay suficiente memoria para la solicitud de asignación, el operador new devuelve NULL o lanza una excepción. El primer argumento para el operador new debe ser de tipo size_t (un tipo definido en STDDEF.H), y el tipo de retorno siempre es nulo *.

Aquí hay un enlace de MSDN para más detalles:

El operador nueva Función

El nuevo operador

  1. new es un operador y una palabra clave.

    ver [1] En 2.13 && en 2.12.

  2. new hace dos cosas: T * t = new T (arg);

    1) asignar memoria para el objeto: void * ptr = operator new (sizeof (T));

    // operador nuevo es una función (como malloc en c), no un operador. (ver [1] En 3.7.4). Pero el artículo 7 [2] dijo que también es un operador. En mi opinión, la diferencia entre el operador y la función es pequeña, y puedes verla cuando recuerdas que el operador de sobrecarga está implementado por funciones.

    // podemos sobrecargar este operador / función (operador nuevo) haciendo lo que queremos justo aquí.

    2) Inicialice el objeto en la memoria asignada: llame a T :: T (arg) en ptr

    // solo el comstackdor puede hacer esto. Ni yo ni tú podemos.

    // también el comstackdor invocará los constructores de los objetos miembros y el constructor de la clase base si T los tiene. Y esta invocación es recursiva. Solo el comstackdor puede hacer eso.

  3. Entonces, el operador nuevo hace parte de las misiones de nuevo, y solo en esta parte podemos hacer algo.

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

    [2]: Meyers, Scott. Efectivo C ++, 3ro.