Для инициализации опорного элемента без ссылки на внешний объект передается конструктору вмещающий класс, метод завода может быть использован, например:разрушиться в членах ссылок инициализируются Factory Method
struct B
{
B() : a(new_a()) {}
// factory
a& new_a()
{
A* a = new A;
return *a;
}
A& a;
};
Однако , конечно B::a
не будет уничтожен, когда конец жизни B
заканчивается, потому что это ссылка. Но нет доступа к B::a
за пределами B
. Так что это утечка памяти. Чтобы исправить это можно назвать A::~A()
из B::~B()
B::~B() {a.~A();}
Но я прочитал вручную вызов деструкторов было нет-нет, поэтому ввод вызова A::~A()
в деструкторе B::~B()
падает плоским, или делает это?
Есть ли более чистый раствор?
Я думаю, вам нужно переосмыслить свой дизайн. Например, * почему * у вас есть ссылка? Разве у вас нет фактического экземпляра (что я действительно рекомендую)? Или указатель (или, скорее, умный указатель)? –
'return * a;' разделяет указатель. 'a' завершается копией' new'ed 'A', но« новый »' A' просочился. – user4581301
@ пользователь4581301 нет. 'new_a' возвращает ссылку (предполагается, что тип возвращаемого значения должен быть' A & 'not' a & ') и который привязывается непосредственно к' B :: a'. Нет копии. –