c++ - liberar - ¿Por qué los compiladores no asignan NULL a la variable de puntero automáticamente después de eliminar la memoria asignada dinámica?
punteros c++ (4)
A menudo sería innecesario, particularmente en un código bien escrito.
Podría esconder errores.
delete p;
sería sintácticamente idiosincrásico si modificara su argumento.
En (1) sería particularmente un desperdicio con std::unique_ptr
.
En otras palabras, cargar al programador con este trabajo si es necesario es lo correcto.
Esta pregunta ya tiene una respuesta aquí:
- ¿Por qué no eliminar establecer el puntero a NULL? 12 respuestas
- ¿Por qué no libera (p) establece p en NULL? 9 respuestas
Tengo un pequeño fragmento de código:
#include <iostream>
using namespace std;
int main()
{
int *p = new int(10);
if(p != NULL)
{
cout<<"Deleted dynamic allocated memory"<<endl;
delete p;
}
if(p == NULL)
{
cout<<"NULL"<<endl;
}
else
{
cout<<"Not NULL"<<endl;
}
return 0;
}
Después de eliminar la memoria asignada dinámica utilizando el operador de delete
, ¿Por qué los compiladores no asignan NULL al puntero (como p = NULL) automáticamente?
Debido a que es un trabajo extra (= más ciclos de reloj, menos rendimiento), generalmente no es necesario.
Se les permite hacerlo, pero no es obligatorio. Creo que la razón por la que no lo hacen consistentemente es porque de todos modos no puedes confiar en eso. Por ejemplo considere esto:
int* a = new int(3);
int* b = a;
delete a;
/// ....
if (b != 0) { /// assume b is either null or points to something valid
std::cout << *b; /// ups
}
Si su diseño requiere que NULL indique un puntero para indicar que ya no señala algo útil, puede agregar código para hacerlo. Pero eso no debería ser el predeterminado, porque puede ser insuficiente e inútil.
Los punteros NULL no resuelven todos los problemas posibles:
int *ip = new int;
int *ip1 = ip;
delete ip;
if (ip1)
*ip1 = 3; // BOOM!
Y a menudo son inútiles:
struct s {
int *ip;
s() : ip(new int) {}
~s() { delete ip; } // nobody cares if ip is NULL, ''cause you can''t see it
};