Создание умного указателя члена класса, ссылающегося на себя - это элегантный шаблон проектирования в c ++? - PullRequest
0 голосов
/ 31 января 2019

Я хотел бы знать, является ли следующий код хорошим шаблоном в C ++?

Нет проблем вообще.Код работает.Но я хотел бы знать, может ли это привести к какой-то проблеме.

#include <iostream>
#include <memory>

template <typename T>
class Class {
    public:
        std::shared_ptr<Class> shared_ptr;

        Class() : shared_ptr(this) {}
        ~Class() { shared_ptr.reset(); }
};

1 Ответ

0 голосов
/ 31 января 2019

Нет, размещенный код не является ни полезным, ни безопасным.

Существует три сценария, и ни один из них не имеет положительного результата:

  1. Объект создан в автоматическом хранилище

В этом случае объект будет уничтожен, когда он выйдет из области видимости.Его деструктор будет запущен и попытается освободить память, которой он не владеет, что приведет к неопределенному поведению.
Пример

Объект создается в динамическом хранилище и получает delete d от вызывающей стороны

В этом случае деструктор будет вызываться при вызове вызывающей стороны (или некотором умном указателе, созданном вызывающей стороной) delete s объект.Затем ваш деструктор снова попытается delete объект, что приведет к неопределенному поведению.
Пример

Объект создается в динамическом хранилище и не получает delete d от вызывающей стороны

В этом случае объект никогда не будет уничтожен.Его деструктор никогда не будет вызван, и его хранилище будет утечка.Ваш дополнительный shared_ptr участник ничего не достиг.
Пример

...