¿Qué sucede cuando desasigna un puntero dos veces o más en C ++?

int main(){ Employee *e = new Employee(); delete e; delete e; ... delete e; return 0; } 

no es una referencia, es un puntero. Obtendrá un comportamiento indefinido si intenta delete un objeto a través de un puntero más de una vez.

Esto significa que casi todo puede pasar de ‘aparecer a trabajar’ a ‘estrellarse’ o algo completamente al azar.

Es un comportamiento indefinido, por lo que cualquier cosa puede suceder.

Lo que es probable que suceda es malo. Por lo general, la tienda gratuita es un sistema cuidadosamente administrado de bloques asignados y gratuitos, y una contabilidad new y delete para mantener todo en un estado constante. Si vuelve a delete , es probable que el sistema haga la misma contabilidad en datos no válidos y, de repente, la tienda gratuita se encuentra en un estado incoherente. Esto se conoce como “corrupción de montón”.

Una vez que eso sucede, cualquier cosa que haga con new o delete puede tener resultados impredecibles, que pueden incluir intentar escribir fuera del área de memoria de la aplicación, corromper los datos en forma silenciosa, pensar erróneamente que no hay más memoria, o duplicar o superponer la asignación. Si tiene suerte, el progtwig fallará pronto, aunque todavía tendrá problemas para descubrir por qué. Si no tiene suerte, seguirá funcionando con malos resultados.

Aparte de la vieja visión sobre “comportamiento indefinido” significa que cualquier cosa podría pasar de la nada a una puerta de entrada al séptimo círculo del infierno que se abre en la memoria principal, en la práctica lo que generalmente sucederá en la mayoría de las implementaciones es que el progtwig seguirá funcionando las elimina, y luego misteriosamente cuelgan en algún momento más tarde en alguna asignación de memoria no relacionada.

Probablemente te estás aventurando en un territorio de “comportamiento indefinido”.

En muchos sistemas, esto causará un locking; por ejemplo, en mi máquina Linux:

 *** glibc detected *** ./cctest: double free or corruption (fasttop): 0x0000000000d59900 *** ======= Backtrace: ========= /lib/libc.so.6[0x7f399f4cbdd6] /lib/libc.so.6(cfree+0x6c)[0x7f399f4d074c] ./cctest[0x400a7a] /lib/libc.so.6(__libc_start_main+0xfd)[0x7f399f474abd] ./cctest[0x400959] 

Si tienes mucha suerte, se bloqueará. Lo que normalmente sucede es que acumula karma hasta que su CEO le muestra el código a su nuevo cliente más importante cuando corrompe / destruye todos sus datos.

En las construcciones comprobadas o depuradas a menudo se atrapa este tipo de cosas, pero pueden pasar desapercibidas por completo y causar esgulps más adelante. Esto es especialmente profundo cuando se involucran múltiples hilos.

No es seguro, y no está definido lo que realmente podría suceder:

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.2

Si le preocupa que esto pueda suceder en sus aplicaciones, deje de usar punteros sin procesar por completo, para que no necesite eliminar (por ejemplo, cambie a shared_ptr ) o siempre configure punteros a NULL (o 0, o mejor todavía nullptr ) después de usted borra los. Llamar a eliminar en un puntero nulo está garantizado para no hacer nada.