В целом, согласен, но могу дополнить по части с Qt.
Как вы правильно заметили в mailing lists, есть 3 основных варианта владения памятью в Qt:
1. Хранение в стеке (тривиально)
2. Отсутствие родителя (предполагается new и delete в пользовательском коде)
3. Есть родитель (только new)
Во втором случае мы сами управляем памятью, поэтому можно использовать std::unique_ptr:
auto mainWindow = std::make_unique();
По возможности надо размещать на стеке, но если не получается, то лучше так.
В третьем случае родитель управляет памятью, но концепцию «умных указателей» можно применить и тут:
То есть опять-таки, мы можем обращаться с этим unowned_ptr, как с unique_ptr, и QObject корректно удалится.
Конечно, это немного текучая абстракция, так как мы всё равно должны убедиться, что не удалим родителя раньше времени. Но хоть что-то.
Чем unowned_ptr лучше «сырого» указателя? Тем, что у него информация о владении закреплена в типе. Никому в голову не придёт его удалить. Можно сделать это ошибкой, если вместо using создать специальный класс, но проще не заморачиваться на этот счёт.
Bjarne уже несколько лет толкает идею unowned_ptr в C++. Прямо сейчас он, наряду с другими полезными мелочами, лежит в Guidelines Support Library.
На практике, есть ещё 4 случай, когда объект «подцепляют» к родителю уже после его создания, но при наличии необходимых helpers, 3 вариант будет удобнее и безопаснее.
Как вы правильно заметили в mailing lists, есть 3 основных варианта владения памятью в Qt:
1. Хранение в стеке (тривиально)
2. Отсутствие родителя (предполагается new и delete в пользовательском коде)
3. Есть родитель (только new)
Во втором случае мы сами управляем памятью, поэтому можно использовать std::unique_ptr:
auto mainWindow = std::make_unique();
По возможности надо размещать на стеке, но если не получается, то лучше так.
В третьем случае родитель управляет памятью, но концепцию «умных указателей» можно применить и тут:
template
using unowned_ptr = T*;
template
unowned_ptr MakeQObject(QObject& parent, Args&&… args);
template
unowned_ptr MakeQObject(QWidget& parent, Args&&… args);
То есть опять-таки, мы можем обращаться с этим unowned_ptr, как с unique_ptr, и QObject корректно удалится.
Конечно, это немного текучая абстракция, так как мы всё равно должны убедиться, что не удалим родителя раньше времени. Но хоть что-то.
Чем unowned_ptr лучше «сырого» указателя? Тем, что у него информация о владении закреплена в типе. Никому в голову не придёт его удалить. Можно сделать это ошибкой, если вместо using создать специальный класс, но проще не заморачиваться на этот счёт.
Bjarne уже несколько лет толкает идею unowned_ptr в C++. Прямо сейчас он, наряду с другими полезными мелочами, лежит в Guidelines Support Library.
На практике, есть ещё 4 случай, когда объект «подцепляют» к родителю уже после его создания, но при наличии необходимых helpers, 3 вариант будет удобнее и безопаснее.