Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359

Указатели и ссылки. Надо ли обнулять? когда и как это делать?

01.02.2012, 13:35. Показов 10208. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
насчет ссылок вроде все ясно. обнулять их нет смысла на сколько я понимаю.
А вот насчет указателей не все так просто.
В книгах часто, при объявлении указателя, его же сразу и обнуляют.
Но т.к. указатель нужен чтоб указывать на объект например, то стараешься
указать ему нужный объект и так.
C++
1
2
TObject Ob, *p_Ob;
p_Ob = &Ob;
По этому вначале я указатели никогда не обнуляю. Просто создаю. Но вот не знаю нап сколько это критично если, напирмер, указатель создан в глобальном модуле а присваивается ему какой-то локальный объект?
и на сколько правильно обнулять указатели в кеонце работы? В книгах часто не обнуляют а я обнуляю. не уверен что делаю нужную вещь. ))
Ну и наконец как обнулять? Вот я знаю есть такое "nullptr"
- но у меня на Builder Diveloper Studio 2006 не работает. Видимо язык устарел. Обнуляю так: 0 или NULL.
Вроде обнуляется а вроде и нет. не уверен. По этому адресую вопросы знатокам форума. Те же вопросы касаются ссылок, если это актуально. Спасибо!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2012, 13:35
Ответы с готовыми решениями:

Когда нужно использовать &ссылки ,а когда *указатели?
Желательно с примерами

Когда использовать указатели ,а когда ссылки?
Когда использовать указатели ,а когда ссылки?

Ссылки в подчиненной форме. Как правильно это делать?
Есть главная форма - Форм1 Есть подчиненная форма - Форм2 Причем Форм2 хотелось бы использовать в разных формах без доработок. В ней...

11
 Аватар для zulkis
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
01.02.2012, 13:47

Не по теме:

-136 - репутация. Вас, Уважаемый это не настораживает?


А если по теме - указатели на то и указатели, они УКАЗЫВАЮТ. А когда вы создаете указатель - он может указывать не в окно, а в кучку ромашек кота в углу, при создании. Его нужно либо в NULL, либо куда вам необходимо (Если говорить сумбурно). Так вот если зайти дальше (начет области видимости) - если указатель должен указывать на солнце, и ВСЕ должны знать ГДЕ это солнце, а вы взяли и этим указателем показываете на кучку ромашек кота в углу, то Вас, извините за выражение, не поймут(остальные, те, кто используют этот глобальный указатель).

Читайте главы указатели и ссылки. Кроме осознания того, КАК это работает, ничего не поможет. Хоть заобъясняйся.
Почитайте как устроена память(нужно же представлять абстрактно, как же это - указывать куда то(либо в никуда))
2
 Аватар для I.M.
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
01.02.2012, 14:01
Если использовать обычные, а не умные указатели, то занулять при создании их нужно хотя бы для того, чтобы знать, выделялась ли память или нет.
Т.е.
C++
1
2
3
4
5
TObject* p_Ob = 0;
//где-то дальше
p_Ob = new TObject();
//и в конце
if(p_Ob){delete p_Ob;p_Ob = 0;}
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.02.2012, 14:04
Цитата Сообщение от I.M. Посмотреть сообщение
C++
1
if(p_Ob){delete p_Ob;
перед тем как применять delete вовсе не надо проверять указатель на ноль
2
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
01.02.2012, 14:18  [ТС]
спасибо! А вместо 0 - NULL можно использовать? Этож наверно правильней.

Добавлено через 5 минут
Вот...я как уже сказал работаю на Builder. У меня создается форма и как бы вот висит стандартный указатель в виде:
C++
1
TForm1 *Form1;
Соотв. он не обнуляеся! Мало ли куда он указывает. Создан был автоматически при создании проекта по этому думаю что ошибки тут нет. Как же быть?

Добавлено через 2 минуты
А вот глобальные указатели? Смысл их обнулять после окончания работы? Программа закроется и они удалятся.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
01.02.2012, 14:24
Цитата Сообщение от Андрей2011 Посмотреть сообщение
NULL можно использовать?
C++
1
#define NULL 0
Цитата Сообщение от Андрей2011 Посмотреть сообщение
Этож наверно правильней.
Правильней
C++
1
int* p = nullptr;
0
385 / 229 / 12
Регистрация: 06.07.2011
Сообщений: 512
01.02.2012, 14:26
созданное билдером трогать смысла нет. тут говорится про код, написанный тобою, а не созданный автоматически.
обнуление указателей сразу после их объявления - обычная практика защитного программирования. о пользе такой практики написано во многих книгах, к примеру в "Совершенном коде" Макконелла.
глобальные указатели даже звучат жутко... за такое можно и расстрелять. но обнулять их разумеется не надо - после выхода из программы автоматически освободится вся память, занимаемая ею.
0
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
01.02.2012, 14:40  [ТС]
А за что это расстрелять интересно? )) Я видел подобное в программе написанной на VC++ серьезными программистами.
И потом это оч удобно. Даже не знаю как бы я без них, без глобальных обходился бы. И чем это плохо? и почему так категорично?

Добавлено через 1 минуту
Однако чем мой код отличается от билдера? они рядышком стоят совсем. эти вот указатели. И к стати, у билдера тоже указатель глобальный. Мож и его тавос...
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
01.02.2012, 15:01
Хороший стиль программирования предлагает инициализировать указатель сразу же после объявления:

C++
1
2
char *ptr = NULL;
int *ptr_array = new int[N];
Небрежность в этом может вызвать серьёзные последствия. Вот пример: сопровождал я несколько лет назад большой проект, написанный на Visual Studio 6. Программа временами валилась с ошибкой памяти, трассировка и отладчик не могли дать определённого ответа - место ошибки плавало самым случайным образом. Удалось только определить функцию, вызов которой иногда приводил к ошибке. Текст функции занимал около 1 тыс. строк жуткого кода без отступов и комментариев. Пришлось разобраться в алгоритме и полностью эту функцию переписать, разделив её на небольшие блоки, выполняющие каждый свою - и только одну - задачу. Во время разбора и выяснилась причина ошибки. В исходном тексте было:

C++
1
2
3
4
5
char *p;
// через несколько сот строк
p= адрес чего-то
// ещё  через несколько сот строк
*p=NULL;
1
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
01.02.2012, 15:12
Цитата Сообщение от Том Ардер Посмотреть сообщение
C++
1
*p=NULL;
разыменовывать то зачем?)
0
Эксперт по математике/физике
 Аватар для Том Ардер
4218 / 3418 / 396
Регистрация: 15.06.2009
Сообщений: 5,818
01.02.2012, 15:35
Jupiter, вот и я не понимаю - зачем? Автор (мне потом удалось его встретить) тоже не знал.
Могу проедположить, что получилось из-за увлечения автора копипастом (вместо корректного наследования классов).
1
184 / 24 / 4
Регистрация: 18.01.2011
Сообщений: 359
01.02.2012, 16:51  [ТС]
т.е. автор случайно "*" поставил я так понимаю?
Да уж жизненная такая история. Аж дрожь по телу.
Спасибо!! Теперь понимаю как важно работать с этими самыми указателями аккуратно.

Добавлено через 3 минуты
Ужас. из-за одной звездочки. Может он просто проглядел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2012, 16:51
Помогаю со студенческими работами здесь

Где надо разместить CGi скрипт и как это делать?
где надо разместить CGi скрипт и как это делать?

надо в режиме sql сделать отчет с запросами на дату. а я не знаю как это делать.(
мне надо в режиме sql сделать отчет с запросами на дату. В отчет у меня идут три запроса. физ лица, юр лица и внешний рынок. Вот я не знаю...

Ситуации, когда ссылки или указатели нежелательны
привет. хочю спросить, на какие фундаментальные(стандартные - std::) типы не следует объявлять ссылки/указатели при объявлении параметров...

Ссылки и указатели: зачем все это?
Здравствуйте форумчане. Кому не лень, могли бы мне доступно объяснить, для чего в С++ все так усложнять? Я про указатели, ссылки, взятие...

StreamReader: когда закрывать поток и нужно ли это делать
Нужно ли закрывать постоянно? sr = new StreamReader("123.txt"); string a = sr.ReadToEnd(); sr.Close(); sr = new...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru