Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создан ли объект? 
:(
    Опции темы
Любитель
Дата 10.2.2007, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Sartorius @  9.2.2007,  09:12 Найти цитируемый пост)
Earnest, идея была такая : вот у нас есть указатель и мы не знаем историю операций, которая с ним произошла до этого.

А я думал, что мы просто не итили указатель. То есть он указывает не пойми куда, то ест ьвылет очень вероятен. А SEH тем более плафтормазависим (онли винда).


--------------------
PM MAIL ICQ Skype   Вверх
Anikmar
Дата 10.2.2007, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Влезаю в сей баян.

Можно показать на примере, когда программист (если он не мазохист) не может знать историю указателя?

ИМХО мнение Kuvaldis самое граммотное и правильное:
Цитата(Kuvaldis @  7.2.2007,  02:19 Найти цитируемый пост)
Вообще-то лучше в конструкторе все указатели сразу инициализировать, чтобы ты ТОЧНО знал, что если указатель ненулевой, то память для него выделена, и наоборот 


PM MAIL ICQ   Вверх
Любитель
Дата 10.2.2007, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Более корректно сформулировано:
Цитата(Earnest @  8.2.2007,  20:15 Найти цитируемый пост)
Способ один. Все указатели сразу инициализировать. Либо нулем, либо указателем на объект. Других способов нет.

Не факт, что наш поинтер фиелд класса - может это локальная переменная.


--------------------
PM MAIL ICQ Skype   Вверх
SergeCpp
Дата 10.2.2007, 02:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 15
Всего: 124



Цитата(Earnest @  9.2.2007,  10:49 Найти цитируемый пост)
...то получишь Access violation, только ловить его нужно через обработку структурных исключений, хотя может и catch (...) поймает...

Для проверок такого рода используются соответствующие функции:

IsBadReadPtr and IsBadWritePtr test whether a given address/size represents a valid block of readable or writable memory for the calling process. These functions know how Windows® allocates memory internally, so they're good at finding bad pointers.

Также IsBadCodePtr и IsBadStringPtr

Вот тема аналогичная (трёхмесячной давности user posted image)

PM MAIL WWW ICQ   Вверх
Earnest
Дата 10.2.2007, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Любитель @  10.2.2007,  03:13 Найти цитируемый пост)
Не факт, что наш поинтер фиелд класса - может это локальная переменная. 

Тот же совет: инициализировать. И еще один: не использовать оин пойнтер по разным назначениям. А то часто пишут такой код:
Код

   void* pTmp;
   ...
   pTmp = ... // чему-то приравниваем
   // используем
   ...

   // еще через 100 строк кода (но в том же контексте)
   pTmp = new abc;   // типа тот пойнтер нам больше не нужен, используем-ка переменную для другой цели
   ...
   //  повторим произвольное число раз
   ...

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

Добавлено @ 19:32 
Цитата(SergeCpp @  10.2.2007,  03:14 Найти цитируемый пост)
Для проверок такого рода используются соответствующие функции:

Сам же там написал: иногда помогают, но не всегда. Опять же, с их помощью нельзя определить, является ли указатель началом объекта, а только то, что он указывает на память, записав в которую ты не получишь исключения. 


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.