Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как проверить ликвидность указателя?  (Прочитано 13325 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 04-08-2006 05:25 » 

Допустим где то  было:
CMyClass * pMy;
pMy= new CMyClass;

в другой части програмы нужно проверить освобождалась ли память
delete pMy;

Как это сделать?
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 04-08-2006 05:42 » 

PSD, я обычно устанавливаю указатель в NULL после деалокации.
а вто это CMyClass * pMy;
лучше заменить на
CMyClass * pMy = NULL;
если точка вызова new и объявления/определения указателя находятся достаточно далеко
напрмер
CMyClass * pMy;
это член класса A
тогда лучше в конструкторе задать
A::A():pMy(NULL){}

впрочем всегда есть возможность получит вот такой код
CMyClass * pMy = NULL;
CMyClass * pMy2 = NULL;
pMy = new CMyClass;
pMy2= pMy;
delete pMy;
pMy2->Do(); // и тут мы получим исключение
Записан

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 04-08-2006 05:47 » 

[quote author=LogRus link=topic=9325.msg135348#msg135348 если точка впрочем всегда есть возможность получит вот такой код
CMyClass * pMy = NULL;
CMyClass * pMy2 = NULL;
pMy = new CMyClass;
pMy2= pMy;
delete pMy;
pMy2->Do(); // и тут мы получим исключение

[/quote]
Вот об этом я и говорю, есть ли возможность проверить ликвидность произвольного указателя?
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 04-08-2006 06:15 » 

Вот об этом я и говорю, есть ли возможность проверить ликвидность произвольного указателя?
PSD, не используй указатель Улыбаюсь) используй умный указатель.
например
auto_prt или boost::shared_ptr и передавай их везде где нужно вместо указателей.
или оперируй ссылками а не указателями

только вот вопрос зачем такие сложности?
не разу не возникало подобной необходимости.

если объект созадаётся единожды и используется во многих местах имеет смысл оформить его в виде синглтона.
иногда это очень удобно.(довольно часто использую синглтоны, для доступа ко всяким общим хранилищам что бы не пробрасывать указатель во все классы)
Записан

Странно всё это....
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-08-2006 06:44 » 

Хм, умный указатель както жк проверяет что его не грохнули интересно как?

По поводу Снглтона   не знаю есть подозрение что накладно будет у меня всетаки сервер связи и нужно укладываться таймауты, у меня гонаются запросы между уевой тучей потоков, посути запрос существует в едиственном экземпляре но за время цикла жизни указатель на него может проходить через объектов каждый из которых работает в своем потоке. Вроди как технология отлажена и особых проблем нет, но переодически при внесении измение(по собсвеной глупости) возникает ситуация когда запрос теряется и остается висеть в системе навечно(что вобщемто не очень страшно) или наоборот объект запроса удаляется до окончания жизненого
цикла (в этом случае как правило происходит крах)
Вот сейчас и пытаюсьпридумать способ при минимальных затратах сделать систему устойчивой к такого рода ошибкам.

Первая идея была добавить в запрос семафор ... но это шило на мыло сейчас отлавливаю уничтожение объекта  потом буду отлавливать не разблокировку.
Вторая проверять указатели на ликвидность сильно облегчило бы жизнь.

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

 






Записан

Да да нет нет все остальное от лукавого.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 04-08-2006 07:02 » 

Кстати говоря boost:: это чья билиотека? Что ф1 мне про нее ничего хорошего не расказал?
Записан

Да да нет нет все остальное от лукавого.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #6 : 04-08-2006 07:26 » 

PSD, ну так вот, я тоже в общем то участвую в разработки некой программы которая должна суппер быстро работать. Но если ты начинаешь бумать о такой мелочи как лишний вызов ради скорости и теряешь при этом надёжность это плохо. Это ранняя оптимизация к тому же лишний вызов(если он будет после оптимизатора) + мелкие проверки миллиарты запросов сожрут в итоге секунду процессорного времени при том что остального кода с более сложной логикой и так полно.
У нас как только кто-то пытается вести подобный разговор ему говорят "Ранняя оптимизация" и он успокаевается и говорят "Нех оптимизировать то в чем не нашли проблем со скоростью в ходе испытаний"

используй умные указатели и явное уничтожение объекта(или не явное когда тебе нужно например сделать удаление при выходе из области видимости для этого лучше подойдёт boost::scoped_ptr).
boost стороння бибилиотека которую у нас активно используют www.boost.org томочу она избавляет от реализации велосипедов
Записан

Странно всё это....
zubr
Гость
« Ответ #7 : 04-08-2006 07:28 » 

Попробуй так:
Код:
CMyClass * pMy = NULL;
CMyClass ** pMy2 = &pMy;
pMy = new CMyClass;
delete pMy;
pMy=NULL;
if(*pMy2!=NULL)
*pMy2->Do();
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 04-08-2006 07:40 » 

zubr, да я еще слишком молод что бы находить простые решенья Улыбаюсь
Записан

Странно всё это....
Alex437
Гость
« Ответ #9 : 09-08-2006 14:01 » 

А я не очень понял в чем идея заведения указатель на указатель.
Если мы обнуляем pMy, то какой смысл проверять
Код:
if(*pMy2 != NULL)
?
С таким же успехом можно просто проверить
Код:
if(pMy != NULL)

И непонятно как указатель на указатель поможет избежать проблемы, которую упоминал LogRus
« Последнее редактирование: 09-08-2006 14:03 от Alex437 » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 09-08-2006 15:31 » 

в другой части програмы нужно проверить освобождалась ли память
delete pMy;
Как это сделать?

Единственно правильный ответ на вопрос - никак. Если у тебя есть указатель не равный NULL, то никто и никгода не сможет сказать освобождена ли память, на которую он указыват, или нет.

Вывод - надо извращаться. Самое простое средство - обнулять указатель сразу же после первого delete.

delete pMy;
pMy = NULL;


В некоторых случаях удобней всё-таки использовать smart pointers (СП). Тут я уже коротко рассказывал:
https://forum.shelek.ru/index.php/topic,9243.msg134327.html#msg134327

Хм, умный указатель както жк проверяет что его не грохнули интересно как?


Дело в том, что гроханье СП не всегда приводит к гроханью оригинального объекта. Это как правило стековые объекты. Просто упаковка для настоящего указателя. И граханье СП приводит к уменьшению внутреннего счётчика числа открытых доступов к оригиналу. Они напрочь перекрывают доступ к delete оригинального объекта. Только СП может его вызвать, или говоря другими словами - он знает, вызывался ли delete для оригинального объекта или нет. Соответственно его можно всегда спросить, а существует ли ещё объект?
Хотя конечно, использование СП накладывает определённые требования. Например, надо всегда работать ТОЛЬКО с СП. Мешанина из простых и умных указателей недопустима.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
zubr
Гость
« Ответ #11 : 09-08-2006 15:59 » 

Цитата
А я не очень понял в чем идея заведения указатель на указатель.
Если мы обнуляем pMy, то какой смысл проверять
Код:
if(*pMy2 != NULL)?
С таким же успехом можно просто проверить
Код:
if(pMy != NULL)
Ну это вопрос по сабжу. Разные бывают ситуации, иногда нужно, чтобы одна часть программы не знала что делает другая часть программы Улыбаюсь
Записан
Alex437
Гость
« Ответ #12 : 10-08-2006 06:01 » 

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines