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 delete
et permettre au système d'exploitation de faire le ménage à la fin du programme.
Alternativement (et encore plus bizarre), vous pourriez allouer un tampon et créer un objet dans celui-ci, puis supprimer le tampon pour récupérer la place mais sans jamais provoquer une tentative d'appel du destructeur.
#include <iostream>
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("not deleting this...");//Constructs an object of type S in the buffer.
//Code that uses s...
std::cout<<s->getx()<<std::endl;
delete[] buffer;//release memory without requiring destructor call...
return 0;
}
Aucun d'entre eux ne semble être une bonne idée, sauf dans des circonstances particulières. 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 fait quelque chose de non trivial, vous compromettez très probablement la validité de votre programme en n'exécutant pas sa sémantique.
Laisser partir un programme main()
et permettre à l'environnement de "nettoyer" est une technique valable mais qu'il vaut mieux éviter à moins que des contraintes ne le rendent strictement nécessaire. Au mieux, c'est un excellent moyen de masquer les véritables fuites de mémoire !
Je soupçonne que la fonctionnalité est présente par souci d'exhaustivité avec la possibilité de delete
d'autres membres générés automatiquement.
J'aimerais bien voir une utilisation pratique réelle de cette capacité.
Il y a la notion de classe statique (sans constructeur) et donc logiquement ne nécessitant pas de destructeur. Mais de telles classes sont plutôt implémentées en tant qu'objets de type namespace
n'ont pas de (bonne) place dans le C++ moderne à moins d'être modélisées.