Умные указатели и наследование от QObject
Один человек сказал мне, что для классов наследуемых от QObject не имеет смысла использовать умные указатели. (У меня окна в классах были как std::unique_ptr). Например:
std::unique_ptr<Commands> commands; // объявление в заголовочнике
commands = std::make_unique<Commands>(); // создание в cpp
Собственно, было сказано, что "для классов наследуемых от QObject не имеет смысла использовать умные указатели" и нужно заменить на обычные. Хочется понять почему? Насколько это верно суждение? Если можно, то какой-нибудь источник почитать на эту тему.
Ответы (1 шт):
Речь, скорее всего, о том, что в Qt принята концепция родительского объекта (см. конструктор QObject), который отвечает за владение дочерним объектом. Т.е. при разрушении родителя, уничтожается и его дочерние объекты. Если наложить эту концепцию на владение std::unique_ptr, то получим вероятность двойного удаления объекта.
Понятно, что в случаях, когда QObject создаётся динамически без родителя (parent==nullptr) и его надо как-то уничтожать, std::unique_ptr вполне имеет право на существование. Но так же можно использовать (но вроде бы уже не особо рекомендуется) и Qt-специфические обёртки типа QScopedPointer.
Т.е. QObject + std::unique_ptr вполне валидная пара, но при условии, что объектом не владеет (или не будет владеть) другой QObject. Иначе это как минимум будет выглядеть похожим на использование ремня и подтяжек одновременно, а максимум - приведёт к проблемам с освобождением памяти во время выполнения.