![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Здраствуйте. Как проверить указатель на валидность? Проверять на NULL или еще есть способы?
Заранее спасибо. |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Sergio,
все зависит от того, какие в твоем случае критерии валидного указателя в общем случае проверить валидность средствами языка нельзя должна быть поддержка со стороны API ОС однако если указатель нулевой, то с большой вероятностью он не валиден -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
А переменные типа int лучше инициализировать 0 или NULL?
Это сообщение отредактировал(а) Sergio - 5.11.2007, 17:37 |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Нечетные указатели обычно неверные, они могут быть верными только если это указатель на элемент массива или указали нестандартное выравнивание. Добавлено через 6 минут и 46 секунд Обычно это связанно с 32х разрядными регистрами процессора и выполняется с целью оптимизации. В месте с тем если это какой-нибудь контроллер, то это может быть неверным. А вот скажем на процессорах типа ARM, вообще не удасться адресовать нечетный адрес, возможно из-за того, что них нельзя обратиться к половинке/четвертинке регистра типа как eax/ax/al/ah -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
Alexeis,
при чем здесь 32-ух разрядные регистры? они вполне могут хранить адрес, не кратный степени двойки
как одно связано с другим? нулевой разряд регистра не может быть единичным? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
_CrtIsValidPointer посмотри
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
MAKCim, представь что предыдущая структура имела нечетную длину, например заканчивается байтом. За ней начинается новая структура. Если прочитать этот байт как DWORD, то автоматом захватим еще кусок соседней структуры. Если мы можем использовать четвертинку регистра, то это нам позволит прочитать только 1 байт и получить верное значение в регистре, а если нет, то единственная возможность прочитать правильное значение, это производить несколько битовых операций. Компилятор сразу отбрасывает использование битовых операций, как неэффективное средство доступа к памяти, потому все структуры и объекты выравниваются на границу 4х байт. Если объявляется сначала переменная в байт, а затем скажем DWORD, то вместо байта компилятор выделит тоже DWORD, т.о. почти всегда адреса получается четными.
Для процессоров i486 совместимых обычно делается тоже самое, но в целях оптимизации по скорости. MAKCim, можешь глянуть под дебагом адреса и проверить. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
В общем случае - никак. Давай конкретные примеры. Учти, что, если появилась необходимость проверять не нулевой указатель на валидность, то это, с огромной вероятностью, ошибка проектирования. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
что вспомнил, то и ляпнул ![]() тогда только умные ресурсы, которые при удалении обнуляют указатели. или всеми любимый boost::shared_ptr (хотя все еще не знаю, насколько он тормозит программу ![]() Это сообщение отредактировал(а) Alek86 - 5.11.2007, 21:18 |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
битовые операции и доступ к памяти никак не связаны
кроме того, выравнивание спасает от мусора только глобальные объекты т. е в случае массива, мы действительно не затроним следующий объект но используя стек, в любом случае будет мусор, читаем ли мы однобайтовое поле как 4-х байтовое или 4-х байтовое как 4-х байтовое Это сообщение отредактировал(а) MAKCim - 5.11.2007, 21:37 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Есть еще такие функции IsBadWritePtr IsBadReadPtr, _CrtIsValidPointer видимо на их основе построена
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
MAKCim, а как тогда объяснить причину ошибки "Data Type Misalignment", которая возникает при попытке обратиться по нечетному адресу и при включении директивы pragma pack(0) Значит так оптимальнее или еще по чему. Мож гляуть в хелп.
Добавлено через 6 минут и 3 секунды Я имел ввиду, что для того чтобы считать значение нужно производить битовую операцию. Это дольше чем просто обратиться! С массивами я же говорил все ок. Видимо так он и делает. Для элементов массивов можно использовать нечетные. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
DominiK |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 11.3.2007 Где: Россия, Омск Репутация: нет Всего: нет |
Разницы нету. |
|||
|
||||
archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |