хороший ли это часовой сторожевой QWidget (для предотвращения утечек памяти при создании и заполнении макета)?

Этот фрагмент кода взят из http://doc.qt.digia.com/qt/qhboxlayout.html#details это, за исключением некоторой магии, о которой я не знаю, полный потенциальных утечек памяти.

Редактировать: спасибо Никосу С. за указание на то, что безопасность исключений в Qt странная, как показано здесь: http://doc.qt.digia.com/qt/exceptionsafety.html Поэтому, чтобы сохранить основной смысл моего вопроса в силе, я обновил пример кода:

 QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("One");
QPushButton *button2 = new QPushButton("Two");
QPushButton *button3 = new QPushButton("Three");
QPushButton *button4 = new QPushButton("Four");
QPushButton *button5 = new QPushButton("Five");

QMyWidgetThatCanThrow *myWidget = new QMyWidgetThatCanThrow("");

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);
layout->addWidget(myWidget);

window->setLayout(layout);
window->show();

Только в самом конце виджеты переопределяются в окне, поэтому любое исключение перед двумя последними строками пропустит все (при условии, что в реальном коде у окна есть родительский элемент).

В аналогичном коде, отличном от Qt, я бы использовал объект sentry для решения подобных задач. Есть ли лучший способ использования сторожа, который другие люди поймут, посмотрев на мой код?

Редактировать:
это будет приемлемый шаблон дизайна?

void PopulateWindow(QWidget *window)
{
QWidget sentry;    //serves as the intial parent ensuring that all
//widgets are either reparented or deleted
QPushButton *button1 = new QPushButton("One",&sentry);
QPushButton *button2 = new QPushButton("Two",&sentry);
QPushButton *button3 = new QPushButton("Three",&sentry);
QPushButton *button4 = new QPushButton("Four",&sentry);
QPushButton *button5 = new QPushButton("Five",&sentry);

QHBoxLayout *layout = new QHBoxLayout(&sentry);
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

window->setLayout(layout);
}    //sentry goes out of scope and deletes anything that was not reparented

используй это:

 QWidget *window = new QWidget;
PopulateWindow(window);
window->show();

1

Решение

что может пойти не так? Какую проблему вы хотите избежать?
если вы создаете виджеты и есть что-то, что вынуждает вас прервать, делайте то же, что вы делаете в обычном C / C ++

if(huhOh!!){
delete button1;
delete button2;
....
return false
}

Редактировать:

Ничто не мешает тебе делать

void PopulateWindow(QWidget *window){

QPushButton *button1 = new QPushButton("One",window);
QPushButton *button2 = new QPushButton("Two",window);
QPushButton *button3 = new QPushButton("Three",window);
QPushButton *button4 = new QPushButton("Four",window);
QPushButton *button5 = new QPushButton("Five",window);

QHBoxLayout *layout = new QHBoxLayout(window);
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);
layout->addWidget(button4);
layout->addWidget(button5);

//layout already set
//window->setLayout(layout);
}

В этом случае вы просто удалите window

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]