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

Применение и удаление указателей - C++

Восстановить пароль Регистрация
 
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
19.11.2013, 10:32     Применение и удаление указателей #1
Здравствуйте.

Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти.

Есть указатель:

int *pHealth;

Функция:

void SetHealth( ... )
*pHealth = 4;


Данная функция вызывается на протяжении всей работы программы.

Мы можем удалить указатель после *pHealth = 4 ?

А так же имеет ли это вобще смысл?

Или нужно создавать указатель и удалять его с целью экономии памяти после его последнего вызова всего действия программы ?

Почему мы бы всегда не использовать указатели ?

Я не могу понять когда и как мы можем ими маневрировать.

Я хочу понять, стоит ли мне все переменные переделать под указатели с целью экономии памяти.

2) Когда мы можем и когда лучше использовать vector в место массивов? Точней когда их лучше будет применять,ведь они эффективней,например не нужно удалять их.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
19.11.2013, 10:44     Применение и удаление указателей #2
Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти.
Тогда когда выделяете под него память при помощи new или malloc, calloc. В остальных случаях - не нужно.
Когда мы можем и когда лучше использовать vector в место массивов?
В любой программе, где используются массивы. Есть еще array для тех же целей.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
19.11.2013, 10:53  [ТС]     Применение и удаление указателей #3
Мы можем указатель использовать и без new,я о том что лучше ведь его использовать с ним,чтоб удалить и сэкономить память.
Extrim88
 Аватар для Extrim88
50 / 50 / 11
Регистрация: 08.02.2013
Сообщений: 189
19.11.2013, 10:57     Применение и удаление указателей #4
pEntity, а вы действительно так объявляете указатель в своей программе
Цитата Сообщение от pEntity Посмотреть сообщение
int *pHealth;
или просто для сокращения записи так написали? Потому что, если вы при объявлении указателя таким образом, не проинициализируете его адресом какого-либо объекта данных, то в дальнейшем попытка использовать его
Цитата Сообщение от pEntity Посмотреть сообщение
*pHealth = 4;
может привести к непредсказуемому поведению программы.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
19.11.2013, 11:07     Применение и удаление указателей #5
без new - нельзя.

Добавлено через 9 минут
Цитата Сообщение от vua72 Посмотреть сообщение
без new - нельзя.
удалять нельзя.
Указатель - удобный способ работы с адресами переменных.
Если вы не выделяли память, то удалять не нужно.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
19.11.2013, 11:07     Применение и удаление указателей #6
Цитата Сообщение от vua72 Посмотреть сообщение
без new - нельзя.
Почему ж?
C++
1
2
3
4
int i = 77;
int *p = &i;
 
cout << *p;
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
19.11.2013, 11:09     Применение и удаление указателей #7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Почему ж?
C++
1
2
3
4
int i = 77;
int *p = &i;
 
cout << *p;
можно конечно, удалять нельзя. Я не дописал, отвлекли
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 11:13     Применение и удаление указателей #8
И удаляется не указатель (если только он не был создан с помощью new), а освобождается память, адрес которой содержится в указателе, если она была выделена с помощью new.

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

Добавлено через 1 минуту
pEntity, читайте литературу.
vua72
410 / 410 / 83
Регистрация: 28.11.2010
Сообщений: 1,158
19.11.2013, 11:14     Применение и удаление указателей #9
Есть указатель:
int *pHealth;
Это такая же переменная, как остальные, но предназначена 1) для косвенного обращения к другой переменной (через ее адрес) или для 2) размещения данных в динамической памяти или куче (когда используется new). Во втором случае удалять обязательно.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 11:20     Применение и удаление указателей #10
Принудительно указатель можно удалить только в том случае, если он размещён в памяти, выделенной по указателю большей кратности, иначе его принудительно можно только освободить. Но именованные указатели удаляются и при завершении области видимости, где они объявлены, если только они не статические. Глобальные и статические указатели удаляются при завершении всей программы. Во всех случаях перед удалением указателя его надо освободить, при этом будут удалены размещённые в выделенной по нему памяти динамические данные. Исключение № 1 - если по указателю не выделялась память, тогда его не нужно освобождать перед удалением. Исключение № 2 - если указатель освобождён без связи с его удалением в связи с принятым решением о прекращении времени жизни динамических данных, тогда его не нужно освобождать непосредственно перед удалением самого указателя. Разновидность исключения № 1 - если указателю присвоен адрес памяти, выделенной не явно, или по другому указателю.

Добавлено через 2 минуты
Для освобождения указателя и выделенной по нему памяти и удаления размещённых в этой памяти данных предназначены операторы
C++
1
delete
и
C++
1
delete []
.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
19.11.2013, 11:20  [ТС]     Применение и удаление указателей #11
Цитата Сообщение от Extrim88 Посмотреть сообщение
pEntity, а вы действительно так объявляете указатель в своей программе или просто для сокращения записи так написали? Потому что, если вы при объявлении указателя таким образом, не проинициализируете его адресом какого-либо объекта данных, то в дальнейшем попытка использовать его может привести к непредсказуемому поведению программы.
Да. int *pHealth = new int;

Я не могу понять когда удалять и когда применять. Я могу все переменные так заменить? И должен удалять после каждого действия над этой переменной. Я просто хочу понять,верно ли я думаю,что замена всех переменных на указатели будет эффективней.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5548 / 2562 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
19.11.2013, 11:22     Применение и удаление указателей #12

Не по теме:

vua72, как в известном мультике "создать нельзя удалить".



Цитата Сообщение от pEntity Посмотреть сообщение
ведь они эффективней
На это счет споры ведутся до сих пор.
Цитата Сообщение от pEntity Посмотреть сообщение
например не нужно удалять их
Это делается неявно.
Цитата Сообщение от pEntity Посмотреть сообщение
Я хочу понять, стоит ли мне все переменные переделать под указатели с целью экономии памяти.
Никакой экономии не получится. А вероятность где-нибудь накосячить сильно возрастет.
Хотя это все от конкретного случая зависит.
Цитата Сообщение от pEntity Посмотреть сообщение
Или нужно создавать указатель и удалять его с целью экономии памяти после его последнего вызова всего действия программы ?
Если вы хотите использовать вектор, чтобы не заморачиваться с массивом, то и по аналогии здесь - не заморачивайтесь с указателями, а используйте переменные.К разговору про области видимости:
C++
1
2
3
4
5
6
7
8
int i = 0;
{
int megaArr[MAX];
for( int i=0; i<MAX; i++ ) megaArr[i] = MAX;
}
 
i++; // Здесь i равняется единице и
     //  память, занятая под массив, свободна
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 11:25     Применение и удаление указателей #13
Цитата Сообщение от pEntity Посмотреть сообщение
И должен удалять после каждого действия над этой переменной.
Нет конечно. Если ты удалишь данное после первого же действия с ним, то с таким же успехом его можно было и не создавать. Освобождать указатели надо в тот момент, когда завершены все действия с адресуемыми по нему данными. Не после каждого действия, а после заведомо последнего.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
19.11.2013, 11:30  [ТС]     Применение и удаление указателей #14
спасибо ребят,уже понятней стало. А вот с классами через указатель все тоже самое? И какой смысл выделять для них указатель,если я могу делать обращение к их членам через точку.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 11:38     Применение и удаление указателей #15
Цитата Сообщение от pEntity Посмотреть сообщение
Я хочу понять, стоит ли мне все переменные переделать под указатели с целью экономии памяти.
Каждый указатель занимает память в размере sizeof(size_t). Это может быть и 4 байта, и даже 8. char весит один байт, short integer - два байта, даже int отлично занимает четыре байта против восьми байт на хранение указателя. И ко всему прочему, эти 4, или 8 байт не заменяют память, расходуемую на сами данные, а добавляются к ней. И того char* занимает уже пять, или девять байт, short int* - шесть, или десять, int* - восемь, или двенадцать. Где экономия? Но если тебе надо то ли 1 000 char, то ли 10 000 и то ли 1 000 int, то ли 10 000, а в сумме 11 000, то резервирование обычных массивов даст 10 000 байт на чары, 40 000 байт на инты и плюс ещё 8, или 16 байт на неявные указатели на массивы, с учётом информации о фактическом размере обоих массивов получаем ещё 8, или 16 байт сверху и того 50 016, или 50 032 байта, а два явных указателя и две явных переменных для хранения фактических размеров массивов дадут в тех же условиях или от 14 016 до 41 016 байт, или от 14 032 до 41 032 байта расхода памяти на динамические массивы. Таким образом и достигается экономия при замене статически резервируемых массивов динамическими массивами на указателях.

Добавлено через 2 минуты
Цитата Сообщение от pEntity Посмотреть сообщение
спасибо ребят,уже понятней стало. А вот с классами через указатель все тоже самое? И какой смысл выделять для них указатель,если я могу делать обращение к их членам через точку.
Что такое "классы через указатели"? Есть классы, есть указатели, одно другому перпендикулярно. А ни каких "классов через указатели" нет.
pEntity
10 / 5 / 1
Регистрация: 12.12.2012
Сообщений: 371
19.11.2013, 11:43  [ТС]     Применение и удаление указателей #16
Ну создают указатель,который обращается к его членам. new *pStudents = &Cstudents;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 13:56     Применение и удаление указателей
Еще ссылки по теме:

C++ Применение указателей
удаление списка указателей C++
C++ Удаление указателей на C++

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
19.11.2013, 13:56     Применение и удаление указателей #17
pEntity, и чё? В чём принципиальное отличие от int*p=new int ?
Yandex
Объявления
19.11.2013, 13:56     Применение и удаление указателей
Ответ Создать тему
Опции темы

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