使用静态 unique_ptr 成员导致内存泄漏

问题描述 投票:0回答:1

我会尝试尽可能地总结用例。

我有一个类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() 。发生的事情如下:

  1. getB() 正在被调用,m_b(仍然是 nullptr)正在被初始化 到一个新的 B()。
  2. 静态变量的初始化被调用 再次,m_b 被重新分配给新的 B()。
  3. 步骤 1 中完成的分配并未被解除分配,因此存在内存泄漏。

有人可以解释一下内存泄漏吗?

c++ memory memory-leaks static unique-ptr
1个回答
0
投票

正如注释所述,这表明在初始化

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.