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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создан ли объект? 
:(
    Опции темы
Gitulyar
Дата 7.2.2007, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.1.2007

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



Есть ненулевой указатель. Как определить объект на который он ссылается уже создан и можно ли использовать его поля и методы или сначало надо создать этот объект?
PM MAIL   Вверх
Kuvaldis
Дата 7.2.2007, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Gitulyar, 
Вообще-то лучше в конструкторе все указатели сразу инициализировать, чтобы ты ТОЧНО знал, что если указатель ненулевой, то память для него выделена, и наоборот


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
SerpentVV
Дата 7.2.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Чисто по указателю никак не определить, куда  он указывает... Элджер вон целую книжку написал по этим вопросам -всякие обертки над указателями... 
PM MAIL   Вверх
Sartorius
Дата 7.2.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



SerpentVV, он об "умных" указателях  писал, а ты про обычные спрашиваешь. 
Можешь попробовать сделать так:
обращаешься к полю какому нить, которое в конструкторе проинициализировано константой, перехватываешь исключение, если исключения не было проверяешь на равность этой константе. 
PM MAIL ICQ   Вверх
SerpentVV
Дата 7.2.2007, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

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



Тогда все нужно решать в конструкторе-деструкторе... Можно и булевское поле прописать... Созда = true, не создан = false
PM MAIL   Вверх
Любитель
Дата 7.2.2007, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Sartorius, не факт, что поможет. По каким-то причинам "мудрости" компилера может получится (со всякими выраниваниями и делитами позже, чем мы написали), что память будет нормально доступна + возможна даже с нужным значением. А если память недоступна, опять таки, нет гарантии, что это выльется в экзепшен, хотя в большинстве компилеров это и так.


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата

возможна даже с нужным значением


 Ну вот надо константу подлиннее делать  smile ИМХО совпадение 8-и байт уже пренебрежимо маловероятно
PM MAIL ICQ   Вверх
Любитель
Дата 7.2.2007, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Но (как я уже говорил) может такое получится, что прога просто вылетит - никакого экзепшена мы не получим. Сие компилерозависимо.


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


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 31.1.2007

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



Понятно. В общем с константой идея неплохая, мне даже нравится. Поэтому: Sartorius БОЛЬШОЕ СПАСИБО
PM MAIL   Вверх
Earnest
Дата 8.2.2007, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sartorius @  7.2.2007,  19:16 Найти цитируемый пост)
обращаешься к полю какому нить, которое в конструкторе проинициализировано константой, перехватываешь исключение,

Откуда возьмется исключение? Константа - член класса никогда не записывается в константную память, ибо сидит вместе с остальными членами класса. Всегда можно написать const_cast<TYPE&>(pMyClass->someField) = XXX, и тебе за это ничего не будет.
Т.е. константные члены класса - чисто семантический прием, вроде private\public секций. 
Такой шанс (попасть в неизменяемую память) есть у статической константы, но до нее по указателю на объект никак не доберешься (т.е. ей по барабану, создан объект или нет).

Способ один. Все указатели сразу инициализировать. Либо нулем, либо указателем на объект. Других способов нет.



--------------------
...
PM   Вверх
Любитель
Дата 8.2.2007, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Gitulyar, читай внимательней - это вовсе не спасение. Более того, скорее всего ты просто получишь вылет. Возможно экзепшен.

Earnest, экзепешен мы хотим взять отсюда:
Код

MyClass* p = reinterpret_cast<MyClass*>(0x00ff00ff); // :)
if (p->anyConst == anyValue) // access violation
...


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


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


Эксперт
****


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

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



А что, все непроинициализированные указатели смотрят в нижнюю область? Что-то не замечала. Если "повезет", то получишь Access violation, только ловить его нужно через обработку структурных исключений, хотя может и catch (...) поймает. Но если указатель имеет другое значение, то ничего не произойдет, если по нему не писать. И даже в этом случае, ошибку ты получишь вовсе не сразу, а в зависимости от того, что испортишь. В большом коде все может долгое время работать, пока где-нибудь совсем в другом месте не подвинешь чуть-чуть код... 



--------------------
...
PM   Вверх
Sartorius
Дата 9.2.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Earnest, идея была такая : вот у нас есть указатель и мы не знаем историю операций, которая с ним произошла до этого. reinterpret_cast приводим его к указателю на объект нашего класса, а в конструкторе этого класса одно из полей  проинициализировано константой (достаточно большой по длине) и значение ее нам известно. Вот мы читаем ее и сравниваем с этим значением. Если она - то наш объект
PM MAIL ICQ   Вверх
Earnest
Дата 9.2.2007, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Угу, я поняла, только сразу после удаления объекта его память вовсе не стирается (до тех пор, пока кто-нибудь ее не займет).
Так что можно удалить объект, потом по старому указателю прочитать свою константу и привет.


--------------------
...
PM   Вверх
Sartorius
Дата 9.2.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Earnest, ну это уже в деструкторе все можно учесть.
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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