Утечка памяти с использованием статического члена unique_ptrC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Утечка памяти с использованием статического члена unique_ptr

Сообщение Anonymous »

Я постараюсь максимально подробно описать вариант использования.
У меня есть класс A (определенный в A.hpp):

Код: Выделить всё

class A
{
public:
static B& getB();
private:
A();
static std::unique_ptr m_b;
};
который использует класс B (также определен в A.hpp) (нет необходимости показывать реализацию класса B, рассматривайте его как черный ящик).
В A.cpp мы определяем наш статический элемент A::m_b как:

Код: Выделить всё

std::unique_ptr A::m_b = std::unique_ptr(new B());
Мы также реализовали метод getB() (также в A.cpp) как:

Код: Выделить всё

B& A::getB()
{
if (!m_b)
{
m_b= std::unique_ptr(new B());
}
return *m_b;
}
У меня есть сценарий (считайте его также черным ящиком, просто предположим, что это происходит), где getB() вызывается перед инициализацией статической переменной. Происходит следующее:
  • вызывается getB(), а m_b (все еще nullptr) инициализируется
    новым B() .
  • инициализация статической переменной вызывается
    снова, и m_b переназначается новой B().
  • Выделение, выполненное на шаге 1, не освобождается и, следовательно, происходит утечка памяти.
Кто-нибудь может объяснить утечку памяти?

Подробнее здесь: https://stackoverflow.com/questions/785 ... ptr-member
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»