Citation:
Je vois pas trop ce qu'il y a à détailler.
Pour différer la construction il suffit d'appeler le constructeur sur une zone mémoire brute, qui peut très bien être allouée sur la pile par exemple.
Ce qui signifie alors qu'il ne faut appeler le destructeur explicitement et que si le constructeur a bien été appelé etc.
Ca s'appelle un placement new. Je ne vois pas vraiment l'intérêt d'utiliser cette technique dans du code en dehors de l'écriture d'un allocateur.
Citation:
On a d'ailleurs les mêmes problèmes avec l'allocation dynamique.
Quels problèmes ? Celui d'appeler explicitement le destructeur ? Cette solution est complexe et fortement sujette à erreurs (notamment parce qu'on oblige à appeler le destructeur explicitement, ce qui n'est pas vraiment naturel).
Citation:
On peut fortement limiter ces problèmes on enveloppant ça dans une classe qui utilise en plus un booléen pour savoir si la mémoire est initialisée ou pas. C'est ce qu'est boost.optional.
On peut aussi lever des exceptions depuis les constructeurs pour signifier que quelque chose s'est mal passé.
Citation:
De toutes manières, tu ne devrais pas avoir à différer la construction. Ici le problème c'est parce que tu utilises des tableaux. Utilise std::vector à la place et plus de problème.
Absolument d'accord. J'aimerais aussi comprendre pourquoi cette restriction sur l'utilisation de std::vector...