Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/40: Рейтинг темы: голосов - 40, средняя оценка - 4.90
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
1

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

19.11.2013, 10:32. Показов 7776. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.

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

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

int *pHealth;

Функция:

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


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

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

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

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

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

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

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

2) Когда мы можем и когда лучше использовать vector в место массивов? Точней когда их лучше будет применять,ведь они эффективней,например не нужно удалять их.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.11.2013, 10:32
Ответы с готовыми решениями:

Применение указателей
Добрый день, можно привести несколько примеров, где имеет смысл использовать указатели? Порой...

Применение указателей
Доброй ночи. Встретил вот такое выражение в книге и не могу понять что к чему: Distance& dist =...

Применение указателей, структур и объединений
Здравствуйте, люди добрые!! (^_^)/ Очень нуждаюсь в вашей помощи... Помогите разобраться...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...

16
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
19.11.2013, 10:44 2
Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти.
Тогда когда выделяете под него память при помощи new или malloc, calloc. В остальных случаях - не нужно.
Когда мы можем и когда лучше использовать vector в место массивов?
В любой программе, где используются массивы. Есть еще array для тех же целей.
1
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
19.11.2013, 10:53  [ТС] 3
Мы можем указатель использовать и без new,я о том что лучше ведь его использовать с ним,чтоб удалить и сэкономить память.
0
51 / 51 / 21
Регистрация: 08.02.2013
Сообщений: 189
19.11.2013, 10:57 4
pEntity, а вы действительно так объявляете указатель в своей программе
Цитата Сообщение от pEntity Посмотреть сообщение
int *pHealth;
или просто для сокращения записи так написали? Потому что, если вы при объявлении указателя таким образом, не проинициализируете его адресом какого-либо объекта данных, то в дальнейшем попытка использовать его
Цитата Сообщение от pEntity Посмотреть сообщение
*pHealth = 4;
может привести к непредсказуемому поведению программы.
1
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
19.11.2013, 11:07 5
без new - нельзя.

Добавлено через 9 минут
Цитата Сообщение от vua72 Посмотреть сообщение
без new - нельзя.
удалять нельзя.
Указатель - удобный способ работы с адресами переменных.
Если вы не выделяли память, то удалять не нужно.
1
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
19.11.2013, 11:07 6
Цитата Сообщение от vua72 Посмотреть сообщение
без new - нельзя.
Почему ж?
C++
1
2
3
4
int i = 77;
int *p = &i;
 
cout << *p;
1
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
19.11.2013, 11:09 7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Почему ж?
C++
1
2
3
4
int i = 77;
int *p = &i;
 
cout << *p;
можно конечно, удалять нельзя. Я не дописал, отвлекли
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.11.2013, 11:13 8
И удаляется не указатель (если только он не был создан с помощью new), а освобождается память, адрес которой содержится в указателе, если она была выделена с помощью new.

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

Добавлено через 1 минуту
pEntity, читайте литературу.
2
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
19.11.2013, 11:14 9
Есть указатель:
int *pHealth;
Это такая же переменная, как остальные, но предназначена 1) для косвенного обращения к другой переменной (через ее адрес) или для 2) размещения данных в динамической памяти или куче (когда используется new). Во втором случае удалять обязательно.
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.11.2013, 11:20 10
Принудительно указатель можно удалить только в том случае, если он размещён в памяти, выделенной по указателю большей кратности, иначе его принудительно можно только освободить. Но именованные указатели удаляются и при завершении области видимости, где они объявлены, если только они не статические. Глобальные и статические указатели удаляются при завершении всей программы. Во всех случаях перед удалением указателя его надо освободить, при этом будут удалены размещённые в выделенной по нему памяти динамические данные. Исключение № 1 - если по указателю не выделялась память, тогда его не нужно освобождать перед удалением. Исключение № 2 - если указатель освобождён без связи с его удалением в связи с принятым решением о прекращении времени жизни динамических данных, тогда его не нужно освобождать непосредственно перед удалением самого указателя. Разновидность исключения № 1 - если указателю присвоен адрес памяти, выделенной не явно, или по другому указателю.

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

Я не могу понять когда удалять и когда применять. Я могу все переменные так заменить? И должен удалять после каждого действия над этой переменной. Я просто хочу понять,верно ли я думаю,что замена всех переменных на указатели будет эффективней.
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
19.11.2013, 11:22 12

Не по теме:

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



Цитата Сообщение от 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 равняется единице и
     //  память, занятая под массив, свободна
1
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.11.2013, 11:25 13
Цитата Сообщение от pEntity Посмотреть сообщение
И должен удалять после каждого действия над этой переменной.
Нет конечно. Если ты удалишь данное после первого же действия с ним, то с таким же успехом его можно было и не создавать. Освобождать указатели надо в тот момент, когда завершены все действия с адресуемыми по нему данными. Не после каждого действия, а после заведомо последнего.
0
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
19.11.2013, 11:30  [ТС] 14
спасибо ребят,уже понятней стало. А вот с классами через указатель все тоже самое? И какой смысл выделять для них указатель,если я могу делать обращение к их членам через точку.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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 Посмотреть сообщение
спасибо ребят,уже понятней стало. А вот с классами через указатель все тоже самое? И какой смысл выделять для них указатель,если я могу делать обращение к их членам через точку.
Что такое "классы через указатели"? Есть классы, есть указатели, одно другому перпендикулярно. А ни каких "классов через указатели" нет.
0
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
19.11.2013, 11:43  [ТС] 16
Ну создают указатель,который обращается к его членам. new *pStudents = &Cstudents;
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
19.11.2013, 13:56 17
pEntity, и чё? В чём принципиальное отличие от int*p=new int ?
0
19.11.2013, 13:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.11.2013, 13:56
Помогаю со студенческими работами здесь

Удаление указателей на C++
#include &lt;iostream&gt; using namespace std; class Induct { public: void Set(int a) ...

удаление указателей
Я создал указатель и выделил память vector &lt; vector &lt;Obj&gt; &gt; *p_L = new vector&lt; vector &lt;Obj&gt; &gt;;...

Удаление указателей
Всем добрый вечер! :) Разбираюсь тут с указателями и возникли вопросы. #include &lt;iostream&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru