Russian Qt Forum
Ноябрь 25, 2024, 07:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: "Анонимное" создание объекта - хорошо или плохо?  (Прочитано 5120 раз)
yashaka
Гость
« : Январь 22, 2010, 11:43 »

Нашел в книге Бланшета и Саммерфилда такой кусок кода:

HexSpinBox::HexSpinBox(QWidget *parent)
    : QSpinBox(parent)
{
    setRange(0, 255);
    validator = new QRegExpValidator(QRegExp("[0-9A-Fa-f]{1,8}"), this);
}


Насколько я понимаю (интуитивно), выделенное жирным шрифтом это по сути new QRegExp("[0-9A-Fa-f]{1,8}")
Удивился тому что так можно писать. Выходит можно?
Просто в джаве есть сборщик мусора и потому там такие конструкции уместны, но ведь в Qt эта память даже после окончания блока освобождена не будет?
Прав ли я? Или может быть это "нормально" писать такой код в Qt?
Записан
DS_tm
Гость
« Ответ #1 : Январь 22, 2010, 11:52 »

Вы не правы). Такая реализация вполне уместна как в коде с использыванием Qt, так и на чистых С++. Такой подход не выделяет динамически память под переменные, а добаляет переменные в стек. Как только программа выходит из области виденья стек очищаеться.

В данном примере память под переменную класса QRegExp будет очищена в конце работы конструктора класса QRegExpValidator.
Записан
yashaka
Гость
« Ответ #2 : Январь 22, 2010, 12:00 »

Ага, ясно. Буду знать:) Большое спасибо!

То есть это точно не равносильно "new QRegExp("[0-9A-Fa-f]{1,8}", ведь так память выделилась бы динамически.
Тогда еще такой вопрос - а такая вот конструкция, с new, допустима?
Записан
Kolobok
Гость
« Ответ #3 : Январь 22, 2010, 12:19 »

Если при создании объекта ему передается parent, то да. Например, так:
Код:
setCentralWidget( new QLabel( "label", this ) );
Записан
yashaka
Гость
« Ответ #4 : Январь 22, 2010, 12:54 »

То есть, в таком случае это допустимо, поскольку Qt запомнит иерархию объектов и когда нужно освободит память, правильно?
Записан
DS_tm
Гость
« Ответ #5 : Январь 22, 2010, 13:26 »

Ну не когда нужно, а в деструкторе).

Каждый объект при удалении удаляет всех сових детей, те удаляют всех своих детей, и так далее.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Январь 22, 2010, 16:23 »

>>выделенное жирным шрифтом это по сути new QRegExp("[0-9A-Fa-f]{1,8}")
категорически нет!
объект создаётся не динамически, в Си++ в отличие от Джава объекты могут быть обычными переменным, и динамическими (создаваемыми с помощью new)

При создании с помощью оператора new, этот оператор возвращает указатель на объект, а не сам объект.
« Последнее редактирование: Январь 22, 2010, 16:25 от lit-uriy » Записан

Юра.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Январь 22, 2010, 16:27 »

То есть, в таком случае это допустимо, поскольку Qt запомнит иерархию объектов и когда нужно освободит память, правильно?
про какой случай? если речь идёт о наследниках QObject, в который передаётся указатель на родителя, там Qt занимается очисткой памяти. Если же код имеет вид:
Код
C++ (Qt)
{
 MyClass myobject(...);
}
 
то выйдя за фигурные скобки (которые в Си/Си++ ограничивают область видимости), объект будет удалён самим компилятором

Цитировать
Или может быть это "нормально" писать такой код в Qt?
нормально писать такой код в Си++, а не только в Qt
« Последнее редактирование: Январь 22, 2010, 16:29 от lit-uriy » Записан

Юра.
yashaka
Гость
« Ответ #8 : Январь 22, 2010, 19:53 »

Ясно, разобрался:)
Большое спасибо за ответы!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.124 секунд. Запросов: 22.