Название: Как лучше создавать объекты Отправлено: zagruzkaaa от Августа 27, 2015, 16:46 Создаю различные объекты на форме через код, например кнопки, тексредакторы и т.д. Они будут находится на форме с самого начала и до конца закрытия формы. Так вот: лучше создавать их через указатель, т.е через new или без? И в чем отличие? Спасибо
Название: Re: Как лучше создавать объекты Отправлено: gil9red от Августа 27, 2015, 17:07 Код: без new объекты создаются на стеке и уничтожаются как только объект выходит из зоны видимости (стек убивается). А вот диалоги удобно создавать в стеке, потому что, когда вызываете функцию явно exec() или какой-нибудь их метод для их вызова (например, getOpenFileName (http://doc.qt.io/qt-5/qfiledialog.html#getOpenFileName) у qfiledialog), то пока их окна открыты выполнение функции остановлено и уже после закрытия окна дальше пойдет выполнение (для одного потока). Код
Если вы создаете объекты, которые нужны только при выполнении функции, то создаете без new это лучше Код чем это Код [/code] Название: Re: Как лучше создавать объекты Отправлено: kuzulis от Августа 27, 2015, 18:05 А если без new:
Код
то что? ;) Название: Re: Как лучше создавать объекты Отправлено: gil9red от Августа 27, 2015, 21:13 А если без new: Код
то что? ;) Было лень и конец рабочего дня, чтобы все варианты описывать :) Название: Re: Как лучше создавать объекты Отправлено: zagruzkaaa от Августа 27, 2015, 22:37 как раз интересно, в случае описание объектов класса: их лучше создавать через указатель или без
Название: Re: Как лучше создавать объекты Отправлено: Igors от Августа 28, 2015, 08:25 А если без new: Та ничего хорошего. В простом примере выше все будет работать, в более сложных нет, получите двойное удалениеКод
то что? ;) как раз интересно, в случае описание объектов класса: их лучше создавать через указатель или без Здесь однозначно указательНазвание: Re: Как лучше создавать объекты Отправлено: Old от Августа 28, 2015, 11:59 Та ничего хорошего. В простом примере выше все будет работать, в более сложных нет, получите двойное удаление И примен такого случая сможете привести?Название: Re: Как лучше создавать объекты Отправлено: Igors от Августа 28, 2015, 12:22 Цитата: cpp class Widget : public QWidget Пусть m_label должен иметь родителем m_widget. Тогда (при удалении Widget), если первым удалится m_label - все норм, он вычеркнется из чайлдов m_widget. Но если наоборот - тогда m_widget захочет грохнуть m_label, а это не указатель на кучу. Конечно если объявлять "в нужном порядке" - будет работать, но ну его нафиг{ ... private: QWidget m_widget; QLabel m_label; } Название: Re: Как лучше создавать объекты Отправлено: Old от Августа 28, 2015, 12:26 Вам придется их описывать/конструировать в нужном порядке, иначе у вас даже не сконструируется.
Поэтому, это рабочий случай. Стандарт гарантирует порядок конструирования/разрушения, а компилятор предупредит о нарушении порядка. Название: Re: Как лучше создавать объекты Отправлено: __Heaven__ от Августа 28, 2015, 13:32 А что там про выравнивание в памяти? Без указателей вроде же лучше?
Название: Re: Как лучше создавать объекты Отправлено: Igors от Августа 28, 2015, 13:42 ..., а компилятор предупредит о нарушении порядка. ???Код Не вижу даже варнинга :) А что там про выравнивание в памяти? Без указателей вроде же лучше? Адрес структур/классов выравнивается одинаково, не зависит от того где распределяется структура. "Парент удаляет чайлда" - а значит парент предполагает что чайлд в куче. Пытаться это как-то обходить не очень разумно, да и не видно зачем Название: Re: Как лучше создавать объекты Отправлено: Old от Августа 28, 2015, 14:50 Не вижу даже варнинга :) А программа работает?Поэтому я и написал, что вам придется соблюдать порядок конструирования, иначе до двойного освобождения дело даже не дойдет. Название: Re: Как лучше создавать объекты Отправлено: Пантер от Августа 28, 2015, 15:05 Не вижу даже варнинга :) А программа работает?Поэтому я и написал, что вам придется соблюдать порядок конструирования, иначе до двойного освобождения дело даже не дойдет. Код
Название: Re: Как лучше создавать объекты Отправлено: Old от Августа 28, 2015, 15:14 А почему бы ей не работать? Он же ссылку берет, а она рабочая. Вот если бы он значение брал, то получил бы лажу. Не важно по ссылке или по значению. Объект label, получив ссылку, воспользуется методами объекта widget, а он еще не сконструирован.Поэтому, придется widget декларировать и конструировать первым, а если попробуете конструировать в другом порядке чем декларировали - получите предупреждение. Название: Re: Как лучше создавать объекты Отправлено: Igors от Августа 28, 2015, 15:20 А почему бы ей не работать? Он же ссылку берет, а она рабочая. Вот если бы он значение брал, то получил бы лажу. В данном случае она берет адрес члена, это само по себе корректно, но вызывается метод этого члена, а он-то еще не сконструирован - вылет. Ну и в конце-концов можно было и такКод: class CBad2 : public QWidget { Название: Re: Как лучше создавать объекты Отправлено: Old от Августа 28, 2015, 15:23 Ну не надо юлить про темы для новичков. :)
Про целесообразность такого описания никто не спорил. Просто вы в очередной раз придумали про невозможность такого описания в связи с двойным освобождением памяти, а я вас поправил. Так писать можно и вы будете вынужденны соблюдать правильный порядок инициализации, иначе до двойного освобождения дело даже не дойдет. Название: Re: Как лучше создавать объекты Отправлено: Igors от Августа 28, 2015, 16:01 Про целесообразность такого описания никто не спорил. Да какая "целесообразность", это слово здесь совершенно неуместно, объявляя виджеты-члены мы просто роем себе яму пытаясь пысать против "Qt ветра" Так писать можно и... А это называется "вводить в заблуждение", причем исполняется сознательно Название: Re: Как лучше создавать объекты Отправлено: Old от Августа 28, 2015, 16:07 А это называется "вводить в заблуждение", причем исполняется сознательно Вовсе нет, все будет работать как надо.Хотите опровергнуть, приведите компилируемый проект, в котором все будет создаваться и работать, а при разрушении будет двойное освобождение памяти. |