Il existe deux cas d'utilisation plausibles. Tout d'abord (comme le notent certains commentaires), il pourrait être acceptable d'allouer dynamiquement des objets, de ne pas les supprimer et de permettre au système d'exploitation de nettoyer à la fin du programme.
Alternativement (et encore plus bizarre), vous pourriez allouer un tampon et y créer un objet, puis supprimer le tampon pour récupérer l'espace mais sans jamais essayer d'appeler le destructeur.
#include
struct S {
const char* mx;
const char* getx(){return mx;}
S(const char* px) : mx(px) {}
~S() = delete;
};
int main() {
char *buffer=new char[sizeof(S)];
S *s=new(buffer) S("ne pas supprimer ceci...");//Constructs an object of type S in the buffer.
//Code that uses s...
std::cout<getx()<
``
Aucune de ces méthodes ne semble être une bonne idée, sauf dans des circonstances spécialisées. Si le destructeur créé automatiquement ne fait rien (parce que le destructeur de tous les membres est trivial), le compilateur créera un destructeur sans effet.
Si le destructeur créé automatiquement ferait quelque chose de non trivial, il est très probable que vous compromettrez la validité de votre programme en ne parvenant pas à exécuter sa sémantique.
Laisser un programme quitter main()
et permettre à l'environnement de 'nettoyer' est une technique valide mais à éviter autant que possible sauf si les contraintes le rendent strictement nécessaire. Au mieux, c'est un excellent moyen de masquer de véritables fuites de mémoire !
Je soupçonne que cette fonctionnalité est présente pour des raisons de complétude avec la possibilité de delete
d'autres membres générés automatiquement.
J'adorerais voir une véritable utilisation pratique de cette capacité.
Il y a la notion d'une classe statique (sans constructeurs) et logiquement ne nécessitant aucun destructeur. Mais de telles classes sont plus correctement implémentées en tant que namespace
et n'ont pas (bonne) place dans le C++ moderne à moins d'être modélisées.
``