Les appels manuels d'un destructeur peuvent-ils indiquer une mauvaise conception ?
Il est largement admis que l'invocation manuelle d'un destructeur indique une mauvaise conception. Cependant, il existe des exceptions à cette règle.
Un scénario dans lequel les appels manuels au destructeur deviennent nécessaires est celui où seul l'objet doit être détruit sans libérer la mémoire allouée. Cela se produit généralement dans les scénarios dans lesquels l'allocation et la désallocation de mémoire sont gérées séparément de la construction et de la destruction d'objets. Dans de tels cas, les objets sont construits en utilisant le placement new sur un bloc de mémoire existant, et les destructeurs sont appelés manuellement pour les effacer.
Considérez l'exemple suivant :
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); } { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
Un autre cas notable où le manuel les appels de destructeur surviennent est le std :: allocator par défaut utilisé par std :: vector. Les éléments sont construits dans le vecteur lors du push_back, mais la mémoire est préalablement allouée en morceaux. Par conséquent, vector::erase peut annihiler des éléments sans nécessairement libérer la mémoire sous-jacente, en particulier si des opérations push_back sont prévues sous peu.
Bien que les appels manuels au destructeur s'écartent des principes stricts de la POO, ils peuvent être appropriés dans les situations où la gestion de la mémoire est indépendant du cycle de vie des objets. De plus, la mise en œuvre de cette approche localement au sein de classes conçues à cet effet peut être qualifiée de conception sonore.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!