Pour initialiser un élément de référence sans une référence à une entité externe passée au constructeur de la classe contenant, une méthode de fabrication peut être utilisé, comme ceci:Destruct un Initialisé membre de référence de la méthode usine
struct B
{
B() : a(new_a()) {}
// factory
a& new_a()
{
A* a = new A;
return *a;
}
A& a;
};
Cependant , bien sûr, B::a
ne sera pas détruit lorsque la vie de B
se termine, parce que c'est une référence. Mais il n'y a pas accès à B::a
en dehors de B
. C'est donc une fuite de mémoire. Pour résoudre ce problème on peut appeler A::~A()
de B::~B()
B::~B() {a.~A();}
Mais j'ai lu manuellement l'appel était un Destructeurs non-non, mettant ainsi un appel à A::~A()
dans le destructor de B::~B()
tombe à plat, ou est-elle?
Y a-t-il une solution plus propre?
Je pense que vous devez repenser votre conception. Par exemple, * pourquoi * devez-vous avoir une référence? Vous ne pouvez pas avoir une instance réelle (ce qui est vraiment ce que je recommande)? Ou un pointeur (ou plutôt un pointeur intelligent)? –
'return * a;' déréférence le pointeur. 'a' se termine avec une copie du' new'ed 'A', mais le' new'ed 'A' est divulgué. – user4581301
@ user4581301 no. 'new_a' renvoie une référence (en supposant que le type de retour est supposé être' A & 'not' a & ') et qui se lie directement à' B :: a'. Il n'y a pas de copie. –