Russian Qt Forum
Ноябрь 06, 2024, 02:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: ->deleteLater()  (Прочитано 27913 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Октябрь 01, 2011, 10:25 »

"Deleting a QObject while pending events are waiting to be delivered can cause a crash."
Я так понимаю что здесь речь идет о том что нельзя удалять объект если в EventLoop другой нитки есть для него события

Я уверен что будет коре.
"Прошу исполнить"  Улыбающийся

Связавшись с deleteLater все время придется думать типа "а что будет в той или иной ситуации?". А для начала мы вообще расписались что это будет работать только в событийной (event-driven) схеме. Потребуется консольная/сетевая версия - и как выцарапывать то deleteLater неясно, а в чужом коде - вообще завал. Впрочем это стандартная проблема любого "deferred delete" и Qt не хуже остальных.

Наверное лучше не спешить лезть головой в петлю, и без крайней необходимости штучки типа deleteLater не использовать
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #16 : Октябрь 01, 2011, 12:03 »

Наверное лучше не спешить лезть головой в петлю, и без крайней необходимости штучки типа deleteLater не использовать
не согласен
Записан
ieroglif
Гость
« Ответ #17 : Октябрь 01, 2011, 13:18 »

простите, конечно, но пока ещё сомневаюсь.
до сих пор не сталкивался с проблемами на deleteLater().
Код
C++ (Qt)
QObject *obj = new QObject(this);
obj->deleteLater();
delete obj;        // новая строка
obj=new QObject(this);
это бессмысленно.
предложи реальный пример, а не абстрактно выдуманный, да который к тому же явно никогда в практике нормального (т.е. думающего над тем что пишется) программиста не встречающегося..
Записан
andrew.k
Гость
« Ответ #18 : Октябрь 01, 2011, 13:21 »

а что будет если сделать так?
Код
C++ (Qt)
QObject *obj =new QObject();
delete obj;
delete obj;
 
Вот то же самое будет и в том примере.
Как евентлуп получив сообщение, что нужно удалить объект узнает, что он уже был удален?

А нитки там не при чем. Просто при обработке событий может потребоваться обращение к самому объекту, который уже удален.
Просто без множества потоков такую ситуацию надо умудриться получить)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Октябрь 01, 2011, 15:23 »

а что будет если сделать так?
Код
C++ (Qt)
QObject *obj =new QObject();
delete obj;
delete obj;
 
Вот то же самое будет и в том примере.
Проверим
Код
C++ (Qt)
#include <QtGui>
 
struct MyObj : public QObject {
virtual ~MyObj( void )
{
qDebug() << "destroy";
}
};
 
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyObj * obj = new MyObj();
obj->deleteLater();
delete obj;
 
app.exec();
 
return 0;
}
 
У меня "destroy" печатается один раз.

Как евентлуп получив сообщение, что нужно удалить объект узнает, что он уже был удален?
Он его просто не получит т.к. деструктор вызовет removePostedEvents (см. исходники)

это бессмысленно.
Просто первые 2 строчки в одном куске кода. 2 последние в другом - и как минимум непросто отследить порядок вызовов
Код
C++ (Qt)
QObject *obj = new QObject(this);
obj->deleteLater();
...
 
Код
C++ (Qt)
delete obj;
obj=new QObject(this);
...
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Октябрь 01, 2011, 15:27 »

не согласен
Ну это Ваше право Улыбающийся Годика 2 назад я ухватил прекрасный заказ - 80% у меня уже было сделано. Вот только UI там было на wxWidgets. Пришлось подучиться портированию и всему такому
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #21 : Октябрь 01, 2011, 15:47 »

не согласен
Ну это Ваше право Улыбающийся Годика 2 назад я ухватил прекрасный заказ - 80% у меня уже было сделано. Вот только UI там было на wxWidgets. Пришлось подучиться портированию и всему такому
К чему этот оффтоп?
А насчет делета - попробуйте удалить sender() в обработке QAbstractItemView::doubleClicked(QModelIndex) делетом.
Записан
andrew.k
Гость
« Ответ #22 : Октябрь 01, 2011, 16:39 »

ну значит разработчики предусмотрели защиту от дурака. славно.
но это не значит, что так нужно делать.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #23 : Октябрь 01, 2011, 18:25 »

Проверим
Код
C++ (Qt)
#include <QtGui>
 
struct MyObj : public QObject {
virtual ~MyObj( void )
{
qDebug() << "destroy";
}
};
 
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MyObj * obj = new MyObj();
obj->deleteLater();
delete obj;
 
app.exec();
 
return 0;
}
 
У меня "destroy" печатается один раз.

А ты хотел чтобы два раза? Улыбающийся Двойное удаление приводит к битью памяти, которое потом вылезти может где угодно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Октябрь 01, 2011, 19:05 »

Двойное удаление приводит к битью памяти, которое потом вылезти может где угодно.
Та неужели? Улыбающийся Никогда не слыхал, наверное сильно память бьют (асе электроны разбегаются)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.231 секунд. Запросов: 23.