pointer none define c++ null

c++ - none - Eliminar NULL pero sin error de compilación



nullptr (5)

Aunque su ejemplo es trivial, no hay forma de que un compilador sepa (en tiempo de compilación) el valor de un puntero.

También puede desreferenciar null en tiempo de compilación:

// this code compiles Object* pObject = 0; pObject->SomeMethod();

Los compiladores no están diseñados para manejar este tipo de condiciones de error en tiempo de compilación.

Y la mayoría (¿todas?) Implementaciones tienen ''eliminar 0'' como no operación. Este código debería funcionar bien:

Object* pObject = new Object(); delete pObject; pObject = 0; delete pObject;

Aunque no estoy 100% seguro de eso :)

Estoy confundido por qué se puede compilar el siguiente código C ++. ¿Por qué una llamada para eliminar el método 0 no produce ningún error?

int *arr = NULL; // or if I use 0, it''s the same thing delete arr;

Intenté ejecutarlo, y no me dio ningún error ...


El lenguaje C ++ garantiza que eliminar p no hará nada si p es igual a NULL.

Para obtener más información, consulte la Sección 16.8.9 aquí :


Es un estándar de facto en los lenguajes C y C ++ (y no solo en ellos) que las rutinas de desasignación de recursos deben aceptar argumentos de null-pointer y simplemente no hacer nada. En realidad, es una convención bastante convencional. Entonces, la verdadera pregunta aquí: ¿por qué te sorprende? ¿Qué te hace pensar que debería producir un error? Además, ¿qué te hace pensar que no debería compilarse ?

Por cierto, su pregunta, tal como está formulada, no parece tener mucho sentido, ya que su código en realidad no puede compilarse. La supuesta declaración de puntero carece de un tipo, lo que hará que cualquier compilador emita un mensaje de diagnóstico.


NULL y 0 no son lo mismo. En C ++ debes usar 0.

No hay nada sintácticamente incorrecto o ambiguo sobre eliminar el puntero nulo. De hecho, esto es por definición un no-op; es decir, la operación de eliminar la dirección 0 es equivalente a no hacer nada en absoluto.


Puede eliminar un puntero NULL sin problemas, y el error que puede / puede tener no será en tiempo de compilación sino en tiempo de ejecución.

int *ptr_A = &a; ptr_A = NULL; delete ptr_A;

Por lo general, es conveniente hacer:

... delete ptr; ptr = NULL;