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 new
o a cualquiera de las funciones calloc
, malloc
o 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 new
o a cualquiera de las funciones calloc
, malloc
o 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 ptr
bien, 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
oexit
.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 new
sin 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
}