我会尝试尽可能地总结用例。
我有一个类A(在A.hpp中定义):
class A
{
public:
static B& getB();
private:
A();
static std::unique_ptr<B> m_b;
};
使用类B(也在A.hpp中定义)(无需显示类B的实现,将其视为黑盒)。
在 A.cpp 中,我们将静态成员 A::m_b 定义为 :
std::unique_ptr<B> A::m_b = std::unique_ptr<B>(new B());
我们还实现了 getB()(也在 A.cpp 中)方法:
B& A::getB()
{
if (!m_b)
{
m_b= std::unique_ptr<B>(new B());
}
return *m_b;
}
我有一个场景(也将其视为黑匣子,只是假设它正在发生),其中在静态变量初始化之前调用 getB() 。发生的事情如下:
有人可以解释一下内存泄漏吗?
正如注释所述,这表明在初始化
A::getB
之前调用 A::m_b
。因此,A::getB
正在访问未初始化的变量。不,您无法像您当前尝试的那样“初始化”m_b
来解决这个问题。
由于访问未初始化的变量是未定义行为,因此任何事情都可能发生,包括内存泄漏。修复方法是 Christian Stieber 建议的 Meyers Singleton:
B& A::getB()
{
static std::unique_ptr<B> m_b=std::make_unique<B>();
return *m_b;
}