Dans une réponse, https://stackoverflow.com/a/704568/8157187, il ya une citation de Stroustrup:
C++ permet explicitement de mise en œuvre de supprimer à zéro un lvalue opérande, et j'avais espéré que les implémentations ferais, mais cette idée ne semble pas avoir la cote auprès des maîtres d'œuvre.
Cependant, je n'ai pas réussi à trouver cette déclaration explicite dans la norme. Il y a une partie de l'actuel projet de norme (N4659), que l'on peut interpréter de cette façon:
6.7:
Lorsque la fin de la durée d'une région de stockage est atteinte, le les valeurs de tous les pointeurs représentant de l'adresse d'une partie de la région de stockage deviennent de pointeur non valide valeurs (6.9.2). Indirection par le biais d'un pointeur invalide valeur et passage d'une valeur de pointeur non valide pour une fonction de libération avoir un comportement indéfini. Toute autre utilisation d'un valeur de pointeur non valide a la mise en œuvre définies par le comportement.
Note: Certaines implémentations peuvent définir que la copie d'une valeur de pointeur non valide provoque une générés par le système d'exécution de la faute
Ainsi, après un delete ptr;
, ptr
s'devient une valeur de pointeur non valide, et à l'aide de cette valeur est mise en œuvre définies par le comportement. Toutefois, cela ne veut pas dire qu' ptr
s'valeur peut changer.
Ce pourrait être une question philosophique, comment peut-on décider qu'une valeur a changé, si l'on ne peut pas utiliser sa valeur?
6.9:
Pour un objet quelconque (autre qu'une classe de base sous-objet) de façon triviale copiable type T, si l'objet est titulaire d'une valeur valide de type T, le sous-jacent octets (4.4) faisant l'objet peut être copié dans un tableau de char, unsigned char, ou std::byte (21.2.1).43 Si l' le contenu de ce tableau est copié en arrière dans l'objet, l'objet est par la suite tenir sa valeur d'origine.
Donc, il semble, qu'il est valide d' memcpy
d'une valeur de pointeur non valide dans un char array (selon la déclaration est "plus fort", de 6,7 6,9. Pour moi, 6.9 semble plus fort).
De cette façon, je peux détecter, que la valeur du pointeur a été modifié par delete
: memcpy
la valeur du pointeur avant et après l' delete
char de la matrice, puis de les comparer.
Donc, si je comprends bien, 6.7 n'accorde pas qu' delete
est autorisé à modifier son paramètre.
Est de supprimer le droit de modifier ses paramètres?
Découvrez les commentaires ici: https://stackoverflow.com/a/45142972/8157187
Voici un peu de chances, mais encore possibles dans le monde réel de code, où cette matière:
SomeObject *o = ...; // We have a SomeObject
// This SomeObject is registered into someHashtable, with its memory address
// The hashtable interface is C-like, it handles opaque keys (variable length unsigned char arrays)
delete o;
unsigned char key[sizeof(o)];
memcpy(key, &o, sizeof(o)); // Is this line OK? Is its behavior implementation defined?
someHashtable.remove(key, sizeof(key)); // Remove o from the hashtable
Bien sûr, cet extrait peut être réorganisées, de sorte qu'il devient un sûrement un code valide. Mais la question est: est-ce un code valide?
Voici une relative train de la pensée: supposons qu'une mise en œuvre n'définir ce que note de bas de page décrit:
la copie d'une valeur de pointeur non valide provoque une générés par le système d'exécution de la faute
6.9 les garanties que j'ai peut - memcpy()
de la valeur. Même une réserve non valide. Donc, dans cette théorie de la mise en œuvre, quand j' memcpy()
de la valeur de pointeur non valide (ce qui devrait lui succéder, 6.9 garantit que), dans un sens, je n'utilise pas la valeur de pointeur non valide, mais seulement ses sous-jacent octets (car il permettrait de générer une faute d'exécution, et de 6,9 ne le permet pas), afin de 6,7 ne s'applique pas.