Russian Qt Forum

Qt => Общие вопросы => Тема начата: yashaka от Январь 22, 2010, 11:43



Название: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: 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?


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: DS_tm от Январь 22, 2010, 11:52
Вы не правы). Такая реализация вполне уместна как в коде с использыванием Qt, так и на чистых С++. Такой подход не выделяет динамически память под переменные, а добаляет переменные в стек. Как только программа выходит из области виденья стек очищаеться.

В данном примере память под переменную класса QRegExp будет очищена в конце работы конструктора класса QRegExpValidator.


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: yashaka от Январь 22, 2010, 12:00
Ага, ясно. Буду знать:) Большое спасибо!

То есть это точно не равносильно "new QRegExp("[0-9A-Fa-f]{1,8}", ведь так память выделилась бы динамически.
Тогда еще такой вопрос - а такая вот конструкция, с new, допустима?


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: Kolobok от Январь 22, 2010, 12:19
Если при создании объекта ему передается parent, то да. Например, так:
Код:
setCentralWidget( new QLabel( "label", this ) );


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: yashaka от Январь 22, 2010, 12:54
То есть, в таком случае это допустимо, поскольку Qt запомнит иерархию объектов и когда нужно освободит память, правильно?


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: DS_tm от Январь 22, 2010, 13:26
Ну не когда нужно, а в деструкторе).

Каждый объект при удалении удаляет всех сових детей, те удаляют всех своих детей, и так далее.


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: lit-uriy от Январь 22, 2010, 16:23
>>выделенное жирным шрифтом это по сути new QRegExp("[0-9A-Fa-f]{1,8}")
категорически нет!
объект создаётся не динамически, в Си++ в отличие от Джава объекты могут быть обычными переменным, и динамическими (создаваемыми с помощью new)

При создании с помощью оператора new, этот оператор возвращает указатель на объект, а не сам объект.


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: lit-uriy от Январь 22, 2010, 16:27
То есть, в таком случае это допустимо, поскольку Qt запомнит иерархию объектов и когда нужно освободит память, правильно?
про какой случай? если речь идёт о наследниках QObject, в который передаётся указатель на родителя, там Qt занимается очисткой памяти. Если же код имеет вид:
Код
C++ (Qt)
{
 MyClass myobject(...);
}
 
то выйдя за фигурные скобки (которые в Си/Си++ ограничивают область видимости), объект будет удалён самим компилятором

Цитировать
Или может быть это "нормально" писать такой код в Qt?
нормально писать такой код в Си++, а не только в Qt


Название: Re: "Анонимное" создание объекта - хорошо или плохо?
Отправлено: yashaka от Январь 22, 2010, 19:53
Ясно, разобрался:)
Большое спасибо за ответы!