Utilisez l'emplacement nouveau.
std::vector<char> memory(sizeof(Myclass));
void* place = &memory[0];
Myclass* f = new(place) Myclass();
Ne pas utiliser la méthode définie par la FAQ:
char memory[sizeof(Myclass)]; // No alignment guarantees on this.
Comme indiqué dans la FAQ, il est dangereux que la norme ne fournit pas l'alignement sur les bénéficiaires de cette mémoire. L'utilisation d'un vecteur standard vous donne des garanties quant à l'alignement car la section de données du vecteur est allouée dynamiquement et la norme fournit des garanties sur l'alignement de la mémoire allouée dynamiquement.
De: n2521 (la copie que j'ai sur mon bureau) Section: 3.7.3.1
Le pointeur retourné doit être convenablement aligné pour qu'il puisse être converti en un pointeur de tout type d'objet avec un l'exigence d'alignement fondamental (3.11), puis utilisée pour accéder à l'objet ou au tableau dans le stockage alloué (jusqu'à ce que le stockage soit explicitement libéré par un appel à une fonction de désallocation correspondante).
Qui nous pointe à 3.11
3.11 Alignement [basic.align]
5 Alignements ont un ordre de plus faible des alignements plus forts ou plus strictes. Les alignements plus stricts ont des valeurs d'alignement plus grandes. Une adresse qui satisfait une exigence d'alignement satisfait également toute exigence d'alignement valide plus faible.
Ne pas oublier d'appeler manuellement le destructor:
f->~Myclass()
Et rappelez-vous d'appeler la destructor avant désallouez la mémoire. –
Génial, accepté. – Alex