Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Проверка валидности указателя


Автор: Ober 27.3.2012, 18:47
Можно ли проверить выделена  под указатель память или нет ? Если удаление производится самостоятельно, то можно сделать ptr = 0 после удаления и потом сравнивать, а если в указателе установлен атрибут Qt::WA_DeleteOnClose, то как можно проверить выделена под него память или нет ?
Заранее спасибо.

Автор: borisbn 28.3.2012, 08:03
http://stackoverflow.com/questions/4595675/determining-whether-pointer-is-valid
но, вообще-то, это - неправильное построение программы, если требуется такая проверка

Автор: Ober 28.3.2012, 09:50
Цитата(borisbn @ 28.3.2012,  08:03)
но, вообще-то, это - неправильное построение программы, если требуется такая проверка

У меня из основного окна MainWindow вызываются дополнительные окна, память выделяется для одного общего указателя QWidget * и освобождается при закрытии этих окон, так же эти окна используют общие указатели QLineEdit, следовательно одновременный вызов нескольких дополнительных окон приводит к фатальным ошибкам. Как можно решить эту проблему ? 
Я думаю можно под каждое окно объявить свои собственные указатели либо сделать так , чтобы из основного окна MainWindow можно было одновременно вызывать не более одного дополнительного окна. Если это верно то как тогда можно ограничить количество дополнительных окон ?

Автор: math64 28.3.2012, 11:00
У QObject есть сигнал destroyed(QObject*) - нужно коннектиться на него, чтобы узнать, когда объект будет удалён.
Глобальные указатели удобно хранить в классе Application.
Тогда, чтобы поазать MyDialog, можно вызвать Application::myDialog()->show();
В первый раз будет создан объект MyDialog, при последующих вызовах будет использоваться уже созданный.


Автор: Alexeis 28.3.2012, 11:38
Цитата(Ober @  28.3.2012,  10:50 Найти цитируемый пост)
У меня из основного окна MainWindow вызываются дополнительные окна, память выделяется для одного общего указателя QWidget * и освобождается при закрытии этих окон

  boost::shared_ptr решает задачу совместного владения. Когда ни один владелец больше не нуждается в объекте, то он уничтожается автоматически (счетчик ссылок обнулится). 

Автор: EnergoHokum 28.3.2012, 13:37
Цитата

boost::shared_ptr

Тогда лучше создавать объект в этом самом shared_ptr-е, а "следящие копии" делать weak_ptr-ом. При удалении "главного" объекта, завёрнутого в shared_ptr, все weak_ptr-ы, порождённые им, будут знать об этом (метод expired).

Автор: math64 28.3.2012, 16:57
При использовании Qt вместо boost::shared_ptr (weak_ptr) для Qt-шных классов лучше использовать QSharedPointer и QWeakPointer соответственно.

Автор: Ober 28.3.2012, 21:52
Да, QSheredPointer  это то, что нужно, я не совсем разобрался как он работает, но он работает. При открытии второго окна, окно уже открытое просто автоматически закрывается. 
Спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)