Russian Qt Forum

Qt => Общие вопросы => Тема начата: billygates от Январь 27, 2010, 09:32



Название: Наследование QList
Отправлено: billygates от Январь 27, 2010, 09:32
Знаю, что в рекоммендациях троллей отдельно подчеркивается, что не стоит наследоваться от системных типов. Но хочется свести менеджмент памяти к минимуму: хочется вместо
Код
C
QList<MyClass *> list_of_classes;
...
qDeleteAll(list_of_classes);
 
чтобы элементы списка удалялись автоматически по выходу за scope. Здесь два варианта: либо умные указатели, либо наследование от QList с реализацией деструктора, удаляющего все указатели. Насколько распространен и правилен второй вариант? Спасибо.

p.s. Да, я знаю, что у QList невиртуальный деструктор.


Название: Re: Наследование QList
Отправлено: niXman от Январь 27, 2010, 09:35
а QList<>::clear() чем не угодил?


Название: Re: Наследование QList
Отправлено: billygates от Январь 27, 2010, 09:41
а QList<>::clear() чем не угодил?
Цитировать
чтобы элементы списка удалялись автоматически по выходу за scope.

cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.


Название: Re: Наследование QList
Отправлено: BRE от Январь 27, 2010, 09:46
А ты поищи по исходникам Qt строку: "public QList<"  :)



Название: Re: Наследование QList
Отправлено: niXman от Январь 27, 2010, 09:50
Цитировать
cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
это не является стандартным поведением. а что вы будите делать если в свой вариант контейнера захотите помещать не указатели?


Название: Re: Наследование QList
Отправлено: billygates от Январь 27, 2010, 10:04
Цитировать
cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
это не является стандартным поведением. а что вы будите делать если в свой вариант контейнера захотите помещать не указатели?
Контейнер исключительно для указателей на один конкретный неполиморфный тип. Собственно, ответ найден:
А ты поищи по исходникам Qt строку: "public QList<"
Ой! А они вравду сами этим пользуются :).

Вопрос закрыт. Всем спасибо за помощь!


Название: Re: Наследование QList
Отправлено: Akaiten от Январь 27, 2010, 10:24
Цитировать
cliear() и так выполнится при вызове деструктора списка. Но только не освободит память из под них, обратите внимание, что у меня в списке содержатся указатели.
это не является стандартным поведением. а что вы будите делать если в свой вариант контейнера захотите помещать не указатели?

Он то как раз и сделать класс для хранения указателей. К тому же можно добавить свойство типа ownObjects. Если оно установлено, то указатели автоматически уничтожаются при разрушении списка.

p.s. Да, я знаю, что у QList невиртуальный деструктор.
Можно написать обёртку вокруг QList<MyClass *>

Использовать умные указатели, например, Qt-шные или какой-нибудь другой, легковесный

Добавлено 11:04
В принципе то что деструктор не виртуальный пофиг, если вы не будете удалять ваш класс через указатель на QList<T>, например:
Код
C++ (Qt)
class MyList: public QList<MyObject *>
{
 ...
};
 
QList<MyObject *> *p = new MyList();
delete p;  // ошибка, т.к. деструктор не виртуальный будет вызван только ~QList<MyObject *>
 
MyList *p2 = new MyList();
delete p2;  // так правильно, будет вызван сначала ~MyList(), а потом ~List<MyObject *>
 
MyList p3;  // тоже правильно