Информация об изменениях

Сообщение Re[2]: Про указатели в Qt - нравится ли вам? от 04.10.2023 13:02

Изменено 04.10.2023 13:04 SaZ

Re[2]: Про указатели в Qt - нравится ли вам?
Здравствуйте, sergii.p, Вы писали:

SP>...


SP>
SP>void addLabelToLayout(QLayout& layout) {
SP>    layout.addWidget(new QLabel("my label"));
SP>}

SP>void addLabelToLayout(QLayout& layout) {
SP>    QLabel l = QLabel("my label");
SP>    layout.addWidget(&l);
SP>}
SP>


SP>C точки зрения С++, первое — явная ересь с утечкой памяти и следует предпочесть второй путь, а с точки зрения Qt всё ровно наоборот.


Где тут утечка? Первый случай корректный, вы создали объект и передали владение в лэйаут. Теперь это забота лэйаута.
Второй случай — вы создали объект на стеке, поместили в лэйаут, и тут же удалили при выходе из скоупа (функции). Тоже всё корректно.

SP>Подытоживая, сейчас парадигма Qt выглядит неправильно.


Неправильно относительно чего? Это просто другая парадигма управления памятью, которая тоже имеет место быть. И во многих случаях тут куда меньше оверхеда, чем со смартпоинтерами.
То что в stl есть только unique/shared вовсе не значит что нельзя использовать другие парадигмы. Лично мне для GUI очень нравится подход — создал, указал куда всунуть (парент), забыл. И всё само работает.
Re[2]: Про указатели в Qt - нравится ли вам?
Здравствуйте, sergii.p, Вы писали:

SP>...


SP>
SP>void addLabelToLayout(QLayout& layout) {
SP>    layout.addWidget(new QLabel("my label"));
SP>}

SP>void addLabelToLayout(QLayout& layout) {
SP>    QLabel l = QLabel("my label");
SP>    layout.addWidget(&l);
SP>}
SP>


SP>C точки зрения С++, первое — явная ересь с утечкой памяти и следует предпочесть второй путь, а с точки зрения Qt всё ровно наоборот.


Где тут утечка? Первый случай корректный, вы создали объект и передали владение в лэйаут. Теперь это забота лэйаута.
Второй случай — вы создали объект на стеке, поместили в лэйаут, и тут же удалили при выходе из скоупа (функции). Тоже всё корректно.

SP>Подытоживая, сейчас парадигма Qt выглядит неправильно.


Неправильно относительно чего? Это просто другая парадигма управления памятью, которая тоже имеет место быть. И во многих случаях тут куда меньше оверхеда, чем со смартпоинтерами.
То что в stl есть только unique/shared вовсе не значит что нельзя использовать другие парадигмы. Лично мне для GUI очень нравится подход — создал, указал куда всунуть (парент), забыл. И всё само работает.
Теоретически можно было бы всё перефигачить на rvalue + std::move, но зачем? Это получился бы новый фреймворк.