Compartir vía


Operadores <new> y enumeraciones

enum align_val_t

enum class align_val_t : size_t {};

operator delete

Función a la que llama una delete para desasignar el almacenamiento de objetos individuales.

void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;

Parámetros

ptr
El puntero cuyo valor se va a representar como no válido mediante la eliminación.

Comentarios

Una expresión de delete llama a la primera función para representar el valor de ptr no válido. El programa puede definir una función con esta firma de función que reemplaza la versión predeterminada definida por la Biblioteca estándar de C++. El comportamiento necesario es aceptar un valor de ptr que es nullptr o que devolvió una llamada anterior a operator new.

El comportamiento predeterminado de un nullptr en ptr es no hacer nada. Cualquier otro valor de ptr debe ser un valor devuelto anteriormente por una new llamada como se ha descrito anteriormente. El comportamiento predeterminado para un valor distinto de null de ptr es reclamar el almacenamiento asignado por la llamada anterior. No se especifica en qué condiciones parte o todo este almacenamiento reclamado se asigna mediante una llamada posterior a operator newo a cualquiera de las funciones calloc, malloco realloc .

Se llama a la segunda función mediante una expresión de delete que corresponde a una expresión new con el formato new( std::size_t ). No hace nada.

La tercera función se llama mediante una expresión de delete que corresponde a una expresión new con el formato new( std::size_t, const std::nothrow_t& ). El programa puede definir una función con esta firma de función que reemplaza la versión predeterminada definida por la Biblioteca estándar de C++. El comportamiento necesario es aceptar un valor de ptr que es nullptr o que devolvió una llamada anterior a operator new. El comportamiento predeterminado es evaluar delete( ptr ).

Ejemplo

Consulte operator new para ver un ejemplo en el que se usa operator delete.

operator delete[]

Función a la que llama una delete para desasignar el almacenamiento de una matriz de objetos.

void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;

Parámetros

ptr
El puntero cuyo valor se va a representar como no válido mediante la eliminación.

Comentarios

La primera función se llama mediante una expresión delete[] para representar el valor de ptr como no válido. La función se puede reemplazar porque el programa puede definir una función con esta firma de función que reemplaza la versión predeterminada definida por la Biblioteca estándar de C++. El comportamiento necesario es aceptar un valor de ptr que es nullptr o que devolvió una llamada anterior a operator new[]. El comportamiento predeterminado de un valor NULL de ptr es no hacer nada. Cualquier otro valor de ptr debe ser un valor que se haya devuelto anteriormente mediante una llamada como se ha descrito previamente. El comportamiento predeterminado para dicho valor no NULL de ptr es recuperar el almacenamiento asignado por la llamada anterior. No se especifica en qué condiciones parte o todo este almacenamiento reclamado se asigna mediante una llamada posterior a operator newo a cualquiera de las funciones calloc, malloco realloc .

Se llama a la segunda función mediante una expresión de delete[] que corresponde a una expresión new[] con el formato new[]( std::size_t ). No hace nada.

La tercera función se llama mediante una expresión de delete[] que corresponde a una expresión new[] con el formato new[]( std::size_t, const std::nothrow_t& ). El programa puede definir una función con esta firma de función que reemplaza la versión predeterminada definida por la Biblioteca estándar de C++. El comportamiento necesario es aceptar un valor de ptr que es nullptr o que devolvió una llamada anterior al operador new[]. El comportamiento predeterminado es evaluar delete[]( ptr ).

Ejemplo

Vea para obtener operator new[] ejemplos del uso de operator delete[].

operator new

La función a la que llama una expresión new para asignar el almacenamiento a objetos individuales.

void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;

Parámetros

count
El número de bytes de almacenamiento que se va a asignar.

ptr
El puntero que se va a devolver.

Valor devuelto

Un puntero a la dirección de bytes más baja del almacenamiento recién asignado. O ptrbien, si usa la tercera forma de la función.

Comentarios

Una expresión de new llama a la primera función para asignar count bytes de almacenamiento alineados adecuadamente para representar cualquier objeto de ese tamaño. Esta función se puede reemplazar. Significa que el programa puede definir una función alternativa con esta firma de función que reemplace la versión predeterminada definida por la biblioteca C++ estándar.

El comportamiento necesario es devolver un puntero no NULL solo si el almacenamiento se puede asignar según lo solicitado. Cada asignación produce un puntero al almacenamiento separado de cualquier otro almacenamiento asignado. El orden y la contigüidad del almacenamiento asignado mediante llamadas sucesivas no se especifica. El valor inicial almacenado no se especifica. El puntero devuelto señala al inicio (dirección de bytes más baja) del almacenamiento asignado. Si count es cero, el valor devuelto no es igual a ningún otro valor devuelto por la función.

El comportamiento predeterminado es ejecutar un bucle. Dentro del bucle, la función primero intenta asignar el almacenamiento solicitado. Si el intento implica una llamada a malloc no se especifica. Si el intento de asignación es correcto, la función devuelve un puntero al almacenamiento asignado. De lo contrario, la función llama a la función designada de tipo new_handler. Si la función a la que se ha llamado se devuelve, el bucle se repite. El bucle finaliza cuando un intento de asignar el almacenamiento solicitado se realiza correctamente o cuando no se devuelve una función llamada.

El comportamiento necesario de una función de tipo new_handler es realizar una de las siguientes operaciones:

  • Hacer que más almacenamiento esté disponible para su asignación y, después, devolverlo.

  • Llame a abort o exit.

  • Produce un objeto de tipo bad_alloc.

El comportamiento predeterminado de una new_handler es iniciar un objeto de tipo bad_alloc. Un nullptr valor designa la función predeterminada new_handler.

El orden y la contiguidad del almacenamiento asignados por llamadas sucesivas a operator new no se especifica, al igual que los valores iniciales almacenados allí.

Para liberar almacenamiento asignado por la primera forma de operator new, llame a operator delete.

La segunda función se llama mediante una expresión new colocación para asignar count bytes de almacenamiento alineados adecuadamente para representar cualquier objeto de ese tamaño. Esta función se puede reemplazar. Significa que el programa puede definir una función alternativa con esta firma de función que reemplace la versión predeterminada definida por la biblioteca C++ estándar.

El comportamiento predeterminado es devolver operator new( count ) si esa función se realiza correctamente. De lo contrario, devuelve nullptr.

Para liberar el almacenamiento asignado por la segunda forma de operator new (es decir, si no devuelve nullptr), llame a operator delete.

La tercera función se llama mediante una selección de ubicación sin new expresión, con el formato new ( ptr ) T. Aquí, ptr consta de un único puntero de objeto. Puede ser útil para construir un objeto en una dirección conocida. La función devuelve ptr. Debe llamar al destructor explícitamente en este objeto.

Si llama a la selección de ubicación newsin asignar, no llame a delete. En su lugar, llame al desasignador para la memoria proporcionada, si es necesario, después de llamar al destructor para el objeto.

Para obtener información sobre el comportamiento de inicio o no inicio de new, vea Los new operadores y delete.

Ejemplo

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main( )
{
    // The first form of new / delete
    MyClass* fPtr1 = new MyClass;
    delete fPtr1;

    // The second form (fail returns nullptr) of new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete fPtr2;

    // The third form (non-allocating placement) of new / delete
    char x[sizeof(MyClass)]; // x is automatic
    MyClass* fPtr3 = new(&x[0]) MyClass;
    fPtr3->~MyClass(); // Requires explicit destructor call
    // no delete because x is on the stack
}

operator new[]

La función de asignación a la que llama una expresión new para asignar el almacenamiento para una matriz de objetos.

void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;

Parámetros

count
El número de bytes de almacenamiento que se va a asignar para el objeto de matriz.

ptr
El puntero que se va a devolver.

Valor devuelto

Un puntero a la dirección de bytes más baja del almacenamiento recién asignado. O ptr, cuando se usa el tercer formulario.

Comentarios

La primera función se llama mediante una expresión new[] para asignar count bytes de almacenamiento correctamente alineados para representar cualquier objeto de matriz de ese tamaño o de un tamaño menor. El programa puede definir una función con esta firma de función que reemplaza la versión predeterminada definida por la Biblioteca estándar de C++. El comportamiento necesario es el mismo que para operator new. El comportamiento predeterminado es devolver operator new( count ) si tiene éxito. De lo contrario, produce una std::bad_alloc excepción (o una excepción derivada de std::bad_alloc). Para liberar almacenamiento asignado mediante esta forma de operator new[], llame a operator delete[].

La segunda función se llama mediante una expresión new[] de colocación para asignar count bytes de almacenamiento correctamente alineados para representar cualquier objeto de matriz de ese tamaño. El programa puede definir una función con esta firma de función que reemplaza la versión predeterminada definida por la Biblioteca estándar de C++. El comportamiento predeterminado es devolver operator new( count ) si esa función se realiza correctamente. De lo contrario, devuelve nullptr. Para liberar almacenamiento asignado mediante esta forma de operator new[], llame a operator delete[]. Para obtener más información sobre el comportamiento de inicio o no inicio de new, vea Los new operadores y delete.

La tercera función se llama mediante una selección de ubicación sin new[] expresión, con el formato new( ptr ) T[ N ]. Este formulario no asigna memoria. Construye los objetos de la memoria que se pasan a través del ptr parámetro. La función devuelve ptr. Debe llamar al destructor explícitamente para cada objeto creado. Es responsable de proporcionar memoria suficiente para ptr. No invoque delete[] en el valor devuelto por la new expresión. En su lugar, desasigne ptr, si es necesario, después de llamar a los destructores.

Ejemplo

// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main() {
    // The first form of array new / delete
    MyClass* fPtr1 = new MyClass[2];
    delete[] fPtr1;

    // The second form (fail returns nullptr) of array new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete[] fPtr2;

    // The third form (non-allocating placement) of array new / delete
    char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic

    MyClass* fPtr3 = new(&x[0]) MyClass[2];
    fPtr3[1].~MyClass(); // Requires explicit destructor calls
    fPtr3[0].~MyClass(); // Recommended in reverse construction order
    // Don't delete[] fPtr3 here.
    // delete[] &x[0] not required because x is on the stack
}