要初始化的基准构件,而不传递给含类的构造的外部实体的引用,一个工厂的方法可用于,例如:自毁基准部件初始化
struct B
{
B() : a(new_a()) {}
// factory
a& new_a()
{
A* a = new A;
return *a;
}
A& a;
};
然而当B
的生命期结束时,B::a
当然不会被销毁,因为它是一个参考。但B
之外没有访问B::a
。所以这是一个内存泄漏。为了解决这个问题一个可以打电话从B::~B()
B::~B() {a.~A();}
A::~A()
但我已阅读手动调用析构函数是一个没有没有,所以把以A::~A()
来电的B::~B()
析构函数放平,或不是吗?
有更清洁的解决方案吗?
我认为你需要重新考虑你的设计。例如,*为什么*你必须有一个参考?难道你没有一个实际的实例(这是我推荐的)?还是一个指针(或者说是一个智能指针)? –
'return * a;'引用指针。 '''a''''''''''''''''''''''''''''''''',''''A''的一个副本被卷起,但''''''A'被泄漏。 – user4581301
@ user4581301没有。 'new_a'返回一个引用(假设返回类型应该是'A&'不''a&')并且直接绑定到'B :: a'。没有副本。 –