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.
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