Me encontré con mi primer compilador que cambia el lvalue pasado a :: eliminar, pero no pone a cero el lvalue. Ese es el siguiente es cierto:¿En qué parte del estándar C++ dice :: delete puede cambiar lvalues?
Foo * p = new Foo();
Foo * q = p;
assert(p != 0);
assert(p == q);
::delete p;
assert(p != q);
assert(p != 0);
Tenga en cuenta que p no es cero después de la operación de eliminación, y ha cambiado desde su valor anterior. Un compañero de trabajo me dijo que esto no es inusual en su experiencia al haber trabajado con algunos compiladores de C++ de mainframes que cambiarían p a 0xFFFFFFFF, así como a otros compiladores que cambiarían p a 0.
Where in the C++ Standard dice que un compilador puede hacer esto?
Buscando a través de stackoverflow, me encontré con esta pregunta: Why doesn’t delete set the pointer to NULL? que tenía una respuesta que hace referencia a Bjarne Stroustrup's response que incluye la declaración:
C++ permite explícitamente una implementación de borrado a cero fuera de un operando lvalue, y tuve esperaba que las implementaciones hicieran eso, pero esa idea no parece haberse vuelto popular entre los implementadores.
He leído y la sección 5.3.5 y 12.5 de la final committee draft C++0x standard re-leído, pero no estoy viendo la parte "explícita". ¿Acabo de buscar en las secciones incorrectas del estándar? O hay una cadena de lógica que está en las secciones, pero simplemente no me estoy conectando correctamente.
Ya no tengo mi copia del Manual de referencia anotado en C++. ¿Estaba en el ARM que un compilador podría hacer esto?
[Editar: Corregir la referencia de sección de 3.5.3 a 5.3.5. También estoy agregando una paradoja interesante como contrapunto a la afirmación de Henk de que p no está definido después de eliminar.]
Hay una paradoja interesante si p se inicializa a nulo.
Foo * p = 0;
Foo * q = p;
assert(p == 0);
assert(p == q);
::delete p;
assert(p == q);
assert(p == 0);
En este caso, el comportamiento está bien documentado. Cuando delete obtiene un puntero nulo, se supone que no debe hacer nada, por lo que p no cambia.
Bueno, el ARM no está aquí ni allá. Y olvidémonos de los lvalues. ¿Su pregunta "puede eliminar cambiar su argumento?". –
Además, el estándar no es importante para decir lo que un compilador puede hacer, solo especifica lo que debe y lo que no debe hacer. No puedo ver nada en el estándar actual que prohíba cambiar el valor del puntero. –
No he formulado mi pregunta como "¿Puede eliminar cambiar su argumento?" porque no quería entrar en cómo una clase que declara operador eliminar soporte cambia su argumento ya que solo toma void *, not an void * & o void **. – Ants