español delete c++ malloc delete-operator

delete c++ español



Comportamiento de malloc con borrar en C++ (3)

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

Cuando asignamos memoria usando malloc, entonces deberíamos liberarla usando gratis y cuando asignamos usar nueva en C ++, entonces deberíamos liberarla usando eliminar.

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

Además, si revertimos y asignamos el uso de new y release usando free, entonces tampoco hay error o advertencia.

¿Por que es esto entonces?


entonces debería haber algún error

Ahi esta. Simplemente no es necesariamente aparente.

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

Es su responsabilidad vigilar y eliminar estos errores. Nada está garantizado para alertarte cuando suceden.


Este es un comportamiento indefinido, ya que no hay manera 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 asegurar que cosas como esas no sucedan. Es simple cuando se utilizan las herramientas adecuadas, es decir, punteros inteligentes. Cuando dices delete , lo estás haciendo mal.


Utilice free() no delete .

Si haces malloc entonces tienes que llamar free para liberar memoria.

Si eres new tienes que llamar a delete para liberar memoria.

Here hay un enlace que lo explica.