"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo desasignar correctamente la memoria asignada con una ubicación nueva en C++?

¿Cómo desasignar correctamente la memoria asignada con una ubicación nueva en C++?

Publicado el 2024-11-07
Navegar:167

How to Properly Deallocate Memory Allocated with Placement New in C  ?

colocación nueva y eliminación de enigma

En C, al asignar memoria con el operador de ubicación nueva, surge un dilema con respecto al método apropiado para desasignar ese recuerdo. Exploremos dos posibles soluciones:

Solución 1:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;

Esta solución intenta eliminar la memoria asignada como un puntero de carácter. Sin embargo, este enfoque es incorrecto porque no maneja adecuadamente el destructor del objeto ni desasigna la memoria sin procesar.

Solución 2:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;

Esta solución también intenta eliminar la memoria asignada, pero llama directamente al operador de eliminación en el puntero Buffer*. Esto funcionaría si la memoria se asignara mediante el nuevo operador habitual. Sin embargo, dado que se utilizó la ubicación nueva, este enfoque también es incorrecto.

Solución correcta:

El método correcto para liberar la memoria asignada es:

buf->~Buffer();
::operator delete(mem);

Esta solución llama explícitamente al destructor del objeto Buffer (buf->~Buffer()) y luego desasigna la memoria sin procesar usando la función de eliminación del operador (::operator delete( mem)).

La distinción fundamental aquí es que cuando se utiliza la ubicación nueva, se debe llamar directamente a la función de eliminación del operador para liberar la memoria sin procesar. Intentar eliminar el puntero obtenido de la ubicación del nuevo operador no invocará correctamente al destructor ni desasignará la memoria por completo.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3