Comportamiento de malloc con delete en C++


int *p=(int * )malloc(sizeof(int));

delete p;

Cuando asignamos memoria usando malloc entonces deberíamos liberarla usando free y cuando asignamos usando new en C++ entonces deberíamos liberarla usando delete.

Pero si asignamos memoria usando malloc y luego usamos delete, entonces debería haber algún error. Pero en el código anterior no hay ningún error o advertencia en C++.

También si invertimos y asignamos usando new y release usando free, entonces tampoco hay error o advertencia.

¿por Qué es así?

Author: Brian Tompsett - 汤莱恩, 2012-06-01

3 answers

Este es un comportamiento indefinido, ya que no hay forma de probar de manera confiable que la memoria detrás del puntero se asignó correctamente (es decir, por new para delete o new[] para delete[]). Es tu trabajo asegurarte de que esas cosas no sucedan. Es simple cuando se utilizan las herramientas adecuadas, es decir, punteros inteligentes. Cada vez que dices delete, lo estás haciendo mal.

 29
Author: Cat Plus Plus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-01 16:40:31

Entonces debería haber algún error

Lo hay. Simplemente no es necesariamente aparente.

El estándar de C++ (y el estándar de C, en el que se modela el estándar de C++) llaman a este tipo de error comportamiento indefinido. Por indefinido quieren decir que cualquier cosa puede suceder. El programa puede continuar normalmente, puede bloquearse inmediatamente, puede producir un mensaje de error bien definido y salir con gracia, puede comenzar a exhibir errores aleatorios en algún momento después del evento de comportamiento indefinido real, o invocar demonios nasales.

Es su responsabilidad tener cuidado y eliminar estos errores. Nada está garantizado para alertar cuando suceden.

 8
Author: n.m.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-01 16:55:39

Use free() no delete.

Si malloc tienes que llamar a free para liberar memoria.

Si new tienes que llamar a delete para liberar memoria.

Aquí hay un enlace que lo explica.

 3
Author: andre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:22