2015-05-24 2 views
2

Я должен показать виджет в главном окне, не делая его как ребенок основного окна. так что, если я динамически выделять пространство памяти, она будет иметь тенденцию к утечке памятиКак избежать утечки памяти в динамически распределенном виджете

Widget *wid = new Widget; 
wid->show(); 

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

+1

Несколько дополнительных опций: 1) выделить в стеке 2) Использовать атрибут 'Qt :: WA_DeleteOnClose' в виджетах – peppe

ответ

5

QT - это довольно старая школа C++, поэтому многие из ее примеров используют необработанные указатели и ручные вызовы для delete без соответствия RAII. Это может выглядеть довольно хорошо на практике, так как большая часть вашего QObjects часто может быть передана права собственности на контейнер, совместимый с RAII, довольно быстро, за исключением нескольких, и потому, что Qt вряд ли выдает исключения.

Однако, он предоставляет свои интеллектуальные указатели, как это:

http://doc.qt.digia.com/4.6/qscopedpointer.html

QScopedPointer<Widget> wid(new Widget); 
wid->show(); 
// `wid` will automatically call `delete` when it goes out of scope. 

Поскольку часто необходимо передать в собственность, чтобы сделать такие вещи, как вставка дочерних виджетов в макет, метод take становится который в основном эквивалентен методу release от std::unique_ptr.

Я хотел бы предложить только придерживаться стандартного C++ смарт-указатели, как unique_ptr, в этом случае вы можете сделать это:

unique_ptr<Widget> wid(new Widget); 
wid->show(); 

... но это до вас, хотите ли вы пойти глубже в QT или держитесь ближе к царству стандарта C++.

1

В качестве родителя вы можете установить mainwindow и включить флаг Qt::Window. Это «способ Qt».

Смежные вопросы