Je suis sûr que ce code devrait être illégal, car il ne fonctionnera certainement pas, mais il semble être autorisé par le FCD C++ 0x. Peut-être que l'un de vos juristes de langue peut vous expliquer comment la norme l'interdit.Légalité de l'utilisation de l'opérateur delete sur un pointeur obtenu à partir du placement new
Il y a aussi une forme de tableau:
class X { /* ... */};
void* raw = malloc(sizeof (X));
X* p = new (raw) X[1]; // according to the standard, the RHS is a placement-new expression
::operator delete[](p); // definitely wrong, per litb's answer
delete [] p; // legal? I hope not
This is the closest question j'ai pu trouver.
EDIT: Je suis tout simplement pas acheter l'argument selon lequel les arguments restrictifs de la langue de la norme de fonctionner void ::operator delete(void*)
appliquent de manière significative à l'opérande de delete
dans un supprimer l'expression. Au mieux, la connexion entre les deux est extrêmement ténue, et un certain nombre d'expressions sont autorisés comme opérandes à delete
qui ne sont pas valides pour passer à void ::operator delete(void*)
. Par exemple:
struct A
{
virtual ~A() {}
};
struct B1 : virtual A {};
struct B2 : virtual A {};
struct B3 : virtual A {};
struct D : virtual B1, virtual B2, virtual B3 {};
struct E : virtual B3, virtual D {};
int main(void)
{
B3* p = new E();
void* raw = malloc(sizeof (D));
B3* p2 = new (raw) D();
::operator delete(p); // definitely UB
delete p; // definitely legal
::operator delete(p2); // definitely UB
delete p2; // ???
return 0;
}
J'espère que cela montre que si un pointeur peut être transmis à void operator delete(void*)
n'a pas d'incidence si ce même pointeur peut être utilisé comme opérateur de delete
.
FYI: Le FCD (N3092) n'est plus le dernier brouillon. Le dernier projet est N3225. J'ai gardé la [page wiki du tag C++ - 0x] (http://stackoverflow.com/tags/c%2b%2b0x/info) mise à jour avec un lien vers le dernier brouillon PDF. –
Notez que 5.3.5/2, qui couvre cela, a été modifié dans le dernier projet. Il est maintenant dit que le pointeur peut être "un pointeur vers un objet non-array créé par une nouvelle expression", et une nouvelle expression inclut en effet de nouvelles expressions. Je ne pense pas que ce soit voulu. –
@James: Merci beaucoup pour le nouveau brouillon. Et 5.3.5 est exactement la section que je pense devrait interdire cela, mais ne le fait pas. Pourriez-vous s'il vous plaît regarder ma réponse (je me prépare à tirer le moindre changement de langage de la nouvelle version) et laissez-moi savoir si vous pensez que cela a une incidence sur cette question? –