У меня есть класс A (определенный в A.hpp):
Код: Выделить всё
class A
{
public:
static B& getB();
private:
A();
static std::unique_ptr m_b;
};
В A.cpp мы определяем наш статический элемент A::m_b как:
Код: Выделить всё
std::unique_ptr A::m_b = std::unique_ptr(new B());
Код: Выделить всё
B& A::getB()
{
if (!m_b)
{
m_b= std::unique_ptr(new B());
}
return *m_b;
}
- вызывается getB(), а m_b (все еще nullptr) инициализируется
новым B() . - инициализация статической переменной вызывается
снова, и m_b переназначается новой B(). - Выделение, выполненное на шаге 1, не освобождается и, следовательно, происходит утечка памяти.
Подробнее здесь: https://stackoverflow.com/questions/785 ... ptr-member
Мобильная версия