0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 25
|
|
1 | |
Как узнать, инициализирован ли указатель?29.06.2011, 18:54. Показов 11267. Ответов 16
Метки нет (Все метки)
0
|
29.06.2011, 18:54 | |
Ответы с готовыми решениями:
16
Как узнать инициализирован ли массив? Как узнать указатель файла QTableWidget как узнать указатель? Как узнать тип, переданный через указатель на void? |
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
|
||||||||||||||||
29.06.2011, 19:02 | 2 | |||||||||||||||
ledkets,
В данном случае выведется "Yes", т.к. переменная указывает на неизвестную область памяти
2
|
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
|
||||||
29.06.2011, 22:23 | 4 | |||||
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
0
|
Заблокирован
|
|
29.06.2011, 22:26 | 5 |
Инициализация указателя - это присваивание ему явного значения.
Что бы проверить, что указатель содержит не мусор (явное значение), нужно либо проверить содержимое указателя в режиме "чтение-только" на предмет какого нить симафора (первый байт должен содержать то-то и то-то. Хотя сие не есть панацея), либо на равенство к нулю (указатель инициализирован, но выключен)
0
|
29.06.2011, 23:28 | 6 | |||||
Вопрос в том, что считать "инициализированным указателем". В примере из поста #2 указатель инициализирован мусором, а потому этот код в каких-то случаях будет писать Yes (если мусор оказался отличным от NULL), а в каких-то No (если мусор оказался равен NULL).
Далее шли бодяги на предмет сравнения с NULL'ом как эквивалент валидности. Это тоже неверно
Ответ на вопрос поставленный вопрос - "нет". Как только в Си появились указатели, сразу же появилось огромное море проблем, связанных с ними. И с тех пор человечество пытается что-то сделать, но универсальных способов контроля за кривыми указателями до сих пор не придумали.
2
|
1 / 1 / 1
Регистрация: 04.10.2012
Сообщений: 45
|
|
26.11.2012, 21:49 | 7 |
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
0
|
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
|
|
26.11.2012, 21:55 | 8 |
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
0
|
425 / 390 / 113
Регистрация: 21.09.2012
Сообщений: 913
|
||||||
26.11.2012, 22:04 | 9 | |||||
0
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
26.11.2012, 22:07 | 10 |
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем, связанных с неинициализированностью, обращению к нуллам и обращению к убитым объектам.
> почему то печатает что "указатель инициализирован"! непонятно Потому что delete не изменяет значение указателя, он только вызывает деструктор и освобождает выделенную память.
1
|
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
|
|||||||||||
26.11.2012, 22:10 | 11 | ||||||||||
для таких целей можно сделать макрос
#define SAFE_DELETE(data) {delete data; data = 0;} тогда вместо
1
|
26.11.2012, 23:00 | 12 |
На самом деле большинство проблем решают наличие головы и опыта работы, потому что начинаешь понимать, где лежат грабли и куда стелить солому. А если голова дурная, то уже мало что спасёт
0
|
OhMyGodSoLong
|
26.11.2012, 23:17
#13
|
Не по теме: А потом становится влом убирать за собой солому, когда знакомишься с чертовски пунктуальной горничной.
0
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
26.11.2012, 23:40 | 14 |
Evg, думаю, смартпоинтеры будут понадёжнее самой НЕдурной головы всё же.
0
|
27.11.2012, 00:15 | 15 |
Сообщение было отмечено как решение
Решение
Хоть обычный указатель, хоть умный, принципиальной разницы нет. Как и любая другая технология - это мощное средство в умелых руках, и способ нажить геморрой для тех, кто не умеет правильно работать с техникой, потому что толком не понимает, как она устроена и для чего придумана.
Вот лично моё мнение, что работать с умными указателями для начинающих - это не правильно. Начинающему крайне важно получить граблями по лбу, чтобы научиться самому стелить солому, там, где надо. А горничных надо звать только тогда, когда сам научился стелить, и процесс застилания соломы превращается в рутину и потерю времени. А когда с детства приучаешься к тому, что солому стелит горничная, то в итоге вырастают программисты-индусы. Это всего лишь моё мнение, которое основано на многолетнем собственном опыте и опыте работы в команде, в которой есть любители горничных (к сожалению, в реальной жизни от таких никуда не денешься). Я ни в коем случае не отрицаю, что нужно использовать результаты научно-технического прогресса. Но хороший специалист просто обязан знать фундаментальные вещи и понимать, откуда растут фундаментальные проблемы
3
|
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
27.11.2012, 00:17 | 16 |
Evg, со всем сказанным согласен. Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
0
|
27.11.2012, 08:58 | 17 |
Это-то понятно. Просто форум - он всё-таки в первую очередь для начинающих и я высказался именно под этим углом.
0
|
27.11.2012, 08:58 | |
27.11.2012, 08:58 | |
Помогаю со студенческими работами здесь
17
Как узнать указатель класса, который передается в библиотеку на C Как узнать, что заданная переменная - это указатель? Как узнать, где кончается массив, если есть указатель на него? Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |