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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: проверка объекта на существование по указателю  (Прочитано 20703 раз)
mos4ever
Гость
« : Июнь 19, 2012, 20:18 »

Помогите! Есть код:
QObject *ptr = new QObject();
delete ptr;

как проверить после удаления объекта по указателю его существование?
Записан
alexis031182
Гость
« Ответ #1 : Июнь 19, 2012, 20:23 »

QPointer
Записан
Fat-Zer
Гость
« Ответ #2 : Июнь 19, 2012, 20:41 »

вообще говоря, никак. надо писать delete ptr; ptr=0;
Записан
shirushizo
Гость
« Ответ #3 : Июнь 20, 2012, 13:08 »

Обратиться к свойствам ptr, если приложение высыпется, то объект уже разрушен. Улыбающийся

Лучше опиши, чего ты хочешь добиться и для чего будешь это использовать.
Записан
mutineer
Гость
« Ответ #4 : Июнь 20, 2012, 13:10 »

Обратиться к свойствам ptr, если приложение высыпется, то объект уже разрушен. Улыбающийся

Ну вот не факт что такое обращение приведет к падению. На месте старого объекта вполне уже может быть расположен новый
Записан
alexis031182
Гость
« Ответ #5 : Июнь 20, 2012, 13:10 »

Обратиться к свойствам ptr, если приложение высыпется, то объект уже разрушен. Улыбающийся
...
Ой, не зря русскую рулетку называют русской Смеющийся
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #6 : Июнь 20, 2012, 13:12 »

Помогите! Есть код:
QObject *ptr = new QObject();
delete ptr;

как проверить после удаления объекта по указателю его существование?
Код
C++ (Qt)
if (qobject_cast<QObject*>(ptr))
   {
       //что то там есть
   }
Только смысл?
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Serr500
Гость
« Ответ #7 : Июнь 20, 2012, 13:33 »

Код
C++ (Qt)
if (qobject_cast<QObject*>(ptr))
   {
       //что то там есть
   }
А с чего Вы взяли, что после delete qobject_cast обязано будет вернуть NULL?
Записан
shirushizo
Гость
« Ответ #8 : Июнь 20, 2012, 16:16 »

Ну вот не факт что такое обращение приведет к падению. На месте старого объекта вполне уже может быть расположен новый
Если уже есть новый, то объект существует, все верно=)

По-хорошему:
вообще говоря, никак. надо писать delete ptr; ptr=0;
и проверять ptr==0. Но при асинхронных процессах, есть шанс проверить ptr==0 между delete ptr; и ptr=0; (это уже другой вопрос)
Или использовать "умные" указатели, но, на сколько мне известно, 100% гарантии они все же не дают.
Записан
mutineer
Гость
« Ответ #9 : Июнь 20, 2012, 16:21 »

Ну вот не факт что такое обращение приведет к падению. На месте старого объекта вполне уже может быть расположен новый
Если уже есть новый, то объект существует, все верно=)

что верно-то? в этом куске памяти может быть абсолютно любой объект, любого типа. и начинаться он может не с этого адреса, а раньше
Записан
Serr500
Гость
« Ответ #10 : Июнь 20, 2012, 16:51 »

и проверять ptr==0. Но при асинхронных процессах, есть шанс проверить ptr==0 между delete ptr; и ptr=0; (это уже другой вопрос)
Или использовать "умные" указатели, но, на сколько мне известно, 100% гарантии они все же не дают.

Код:
void My_Delete(T** p)
{
    mutex->lock();
    delete *p;
    *p = NULL;
    mutex->unlock();
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июнь 20, 2012, 17:43 »

Код:
void My_Delete(T** p)
{
    mutex->lock();
    delete *p;
    *p = NULL;
    mutex->unlock();
}
Так затрачивается дорогостоящая блокировка и вынуждается ** везде. А достигается только что 2 нитки не удалят. Маловато, напр если др нитка использует *p - она рухнет после его удаления. QSharedPointer смотрится выгоднее
Записан
fuCtor
Гость
« Ответ #12 : Июнь 23, 2012, 21:36 »

и проверять ptr==0. Но при асинхронных процессах, есть шанс проверить ptr==0 между delete ptr; и ptr=0; (это уже другой вопрос)
Или использовать "умные" указатели, но, на сколько мне известно, 100% гарантии они все же не дают.

Код:
void My_Delete(T** p)
{
    mutex->lock();
    delete *p;
    *p = NULL;
    mutex->unlock();
}

Уже все придумано: http://doc.qt.nokia.com/4.7-snapshot/qatomicpointer.html
Записан
Serr500
Гость
« Ответ #13 : Июнь 23, 2012, 21:43 »

Код:
QAtomicPointer<T> p;
T* pT = p.fetchAndStoreRelaxed(NULL);
delete pT;
Я правильно понял?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 24, 2012, 12:40 »

Код:
QAtomicPointer<T> p;
T* pT = p.fetchAndStoreRelaxed(NULL);
delete pT;
Я правильно понял?
Так p надо инициализировать и потом уже отдать всем ниткам, т.е. они должны извлекать реальный указатель из p. Тогда двойное удаление исключается, но толку от этого немного - ведь обращения по указателю ставшему нулевым остаются

А зачем нужен это класс если чтение/запись указателей и так атомарны?
Обычно чем больше классов человек знает - тем хуже он отвечает на такие вопросы. Ну посмотрим, может в этот раз будет "приятное исключение"  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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