Форум программистов, компьютерный форум CyberForum.ru

Как узнать, инициализирован ли указатель? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.84
ledkets
0 / 0 / 0
Регистрация: 22.06.2010
Сообщений: 25
29.06.2011, 18:54     Как узнать, инициализирован ли указатель? #1
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
29.06.2011, 19:02     Как узнать, инициализирован ли указатель? #2
ledkets,

C
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
   int* ptr;
   
   if (!ptr)
      printf("Not");
   else
      printf("Yes");
 
   return 0;
}
В данном случае выведется "Yes", т.к. переменная указывает на неизвестную область памяти

C
1
2
3
4
5
6
7
8
9
10
11
int main()
{
   int* ptr = NULL;
   
   if (!ptr)
      printf("Not");
   else
      printf("Yes");
 
   return 0;
}
Выведется "Not";

В данном случае выведется "Yes", т.к. переменная указывает на неизвестную область памяти

C
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
   int a = 1;
   int* ptr = &a;
   
   if (!ptr)
      printf("Not");
   else
      printf("Yes");
 
   return 0;
}
Выведет "Yes", так как ptr хранит адрес переменной a;
oxotnik
 Аватар для oxotnik
1584 / 1061 / 33
Регистрация: 21.08.2008
Сообщений: 4,545
Записей в блоге: 1
29.06.2011, 21:43     Как узнать, инициализирован ли указатель? #3
Цитата Сообщение от ledkets Посмотреть сообщение
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
в общем случае никак
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
29.06.2011, 22:23     Как узнать, инициализирован ли указатель? #4
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
Bers
Заблокирован
29.06.2011, 22:26     Как узнать, инициализирован ли указатель? #5
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Мне вобще непонятно, как можно считать NULL указатель не инициализированным, таковым можно считать указатель который был обьявлен и ему не было присвоено никакое значение, а когда вы пишете
C++
1
 int* ptr = NULL;
то вы инициализируете указатель значением NULL и он уже содержит в себе не мусор, а определенное значение которое гарантированно не является валидным адресом обьекта в памяти.
Инициализация указателя - это присваивание ему явного значения.
Что бы проверить, что указатель содержит не мусор (явное значение), нужно либо проверить содержимое указателя в режиме "чтение-только" на предмет какого нить симафора (первый байт должен содержать то-то и то-то. Хотя сие не есть панацея), либо на равенство к нулю (указатель инициализирован, но выключен)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
29.06.2011, 23:28     Как узнать, инициализирован ли указатель? #6
Цитата Сообщение от ledkets Посмотреть сообщение
Появился вопрос, как узнать в C++ инициализирован ли определенный указатель?
Вопрос в том, что считать "инициализированным указателем". В примере из поста #2 указатель инициализирован мусором, а потому этот код в каких-то случаях будет писать Yes (если мусор оказался отличным от NULL), а в каких-то No (если мусор оказался равен NULL).

Далее шли бодяги на предмет сравнения с NULL'ом как эквивалент валидности. Это тоже неверно

C
1
2
p = malloc (10);
free (p);
после такого кода p инициализирован (т.е. содержит вполне конкретное значение), отличен от NULL, но в то же время невалиден, потому как эта память уже освобождена.

Ответ на вопрос поставленный вопрос - "нет". Как только в Си появились указатели, сразу же появилось огромное море проблем, связанных с ними. И с тех пор человечество пытается что-то сделать, но универсальных способов контроля за кривыми указателями до сих пор не придумали.
NEW_NAME
1 / 1 / 0
Регистрация: 04.10.2012
Сообщений: 45
26.11.2012, 21:49     Как узнать, инициализирован ли указатель? #7
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 21:55     Как узнать, инициализирован ли указатель? #8
Цитата Сообщение от NEW_NAME Посмотреть сообщение
Действительно никак что ли? Просто если не для себя пишешь и надо узнать выделялась ли для указателя память, чтобы знать нужно ли ее высвободить в функции перед тем, как заново выделить
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
v.a.l.i.d
 Аватар для v.a.l.i.d
412 / 377 / 10
Регистрация: 21.09.2012
Сообщений: 913
26.11.2012, 22:04     Как узнать, инициализирован ли указатель? #9
Цитата Сообщение от ps10n1ck Посмотреть сообщение
для этого указатель в самом начале инициализируют 0 (NULL), а потом проверяют на равенство 0
C++
1
2
3
4
5
6
    int *ptr = new int;
 
    delete ptr;
 
    if (ptr) cout << "Указатель инициализирован" << endl;
    else cout << "Указатель неинициализирован" << endl;
почему то печатает что "указатель инициализирован"! непонятно почему так получается
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
26.11.2012, 22:07     Как узнать, инициализирован ли указатель? #10
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем, связанных с неинициализированностью, обращению к нуллам и обращению к убитым объектам.

> почему то печатает что "указатель инициализирован"! непонятно
Потому что delete не изменяет значение указателя, он только вызывает деструктор и освобождает выделенную память.
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
26.11.2012, 22:10     Как узнать, инициализирован ли указатель? #11
Цитата Сообщение от V.A.L.I.D Посмотреть сообщение
C++
1
2
3
4
5
6
    int *ptr = new int;
 
    delete ptr;
 
    if (ptr) cout << "Указатель инициализирован" << endl;
    else cout << "Указатель неинициализирован" << endl;
почему то печатает что "указатель инициализирован"! непонятно почему так получается
для таких целей можно сделать макрос
#define SAFE_DELETE(data) {delete data; data = 0;}

тогда вместо
C++
1
delete ptr;
пишем
C++
1
SAFE_DELETE(ptr);
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
26.11.2012, 23:00     Как узнать, инициализирован ли указатель? #12
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Смарт-поинтеры решат если не все, то по крайней мере большинство проблем
На самом деле большинство проблем решают наличие головы и опыта работы, потому что начинаешь понимать, где лежат грабли и куда стелить солому. А если голова дурная, то уже мало что спасёт
OhMyGodSoLong
26.11.2012, 23:17
  #13

Не по теме:

А потом становится влом убирать за собой солому, когда знакомишься с чертовски пунктуальной горничной.

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
26.11.2012, 23:40     Как узнать, инициализирован ли указатель? #14
Evg, думаю, смартпоинтеры будут понадёжнее самой НЕдурной головы всё же.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
27.11.2012, 00:15     Как узнать, инициализирован ли указатель? #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение

Не по теме:

А потом становится влом убирать за собой солому, когда знакомишься с чертовски пунктуальной горничной.

Цитата Сообщение от silent_1991 Посмотреть сообщение
Evg, думаю, смартпоинтеры будут понадёжнее самой НЕдурной головы всё же.
Хоть обычный указатель, хоть умный, принципиальной разницы нет. Как и любая другая технология - это мощное средство в умелых руках, и способ нажить геморрой для тех, кто не умеет правильно работать с техникой, потому что толком не понимает, как она устроена и для чего придумана.

Вот лично моё мнение, что работать с умными указателями для начинающих - это не правильно. Начинающему крайне важно получить граблями по лбу, чтобы научиться самому стелить солому, там, где надо. А горничных надо звать только тогда, когда сам научился стелить, и процесс застилания соломы превращается в рутину и потерю времени. А когда с детства приучаешься к тому, что солому стелит горничная, то в итоге вырастают программисты-индусы. Это всего лишь моё мнение, которое основано на многолетнем собственном опыте и опыте работы в команде, в которой есть любители горничных (к сожалению, в реальной жизни от таких никуда не денешься). Я ни в коем случае не отрицаю, что нужно использовать результаты научно-технического прогресса. Но хороший специалист просто обязан знать фундаментальные вещи и понимать, откуда растут фундаментальные проблемы
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
27.11.2012, 00:17     Как узнать, инициализирован ли указатель? #16
Evg, со всем сказанным согласен. Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 08:58     Как узнать, инициализирован ли указатель?
Еще ссылки по теме:

Расскажите, как здесь работает указатель на указатель? C++
Почему указатель на указатель объявляется как float **A; C++
C++ Как правильно удалять выделенную память под указатель на указатель?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,132
Записей в блоге: 26
27.11.2012, 08:58     Как узнать, инициализирован ли указатель? #17
Цитата Сообщение от silent_1991 Посмотреть сообщение
Мой комментарий относился к случаю, когда шишки уже набиты, и надо код писать, а не велосипеды изобретать.
Это-то понятно. Просто форум - он всё-таки в первую очередь для начинающих и я высказался именно под этим углом.
Yandex
Объявления
27.11.2012, 08:58     Как узнать, инициализирован ли указатель?
Ответ Создать тему
Опции темы

Текущее время: 10:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru