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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 393
#1

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

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

Здравствуйте.

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

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

int *pHealth;

Функция:

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


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

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

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

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

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

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

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

2) Когда мы можем и когда лучше использовать vector в место массивов? Точней когда их лучше будет применять,ведь они эффективней,например не нужно удалять их.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 10:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Применение и удаление указателей (C++):

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

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

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

удаление указателей - C++
Я создал указатель и выделил память vector < vector <Obj> > *p_L = new vector< vector <Obj> >; Как мне теперь освободить...

Удаление указателей на C++ - C++
#include <iostream> using namespace std; class Induct { public: void Set(int a) { x=a;

Удаление массива указателей - C++
есть класс: class test { private: static test **list; static int count_object; public: void mesto::Add() {

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

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

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

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

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

Я не могу понять когда удалять и когда применять. Я могу все переменные так заменить? И должен удалять после каждого действия над этой переменной. Я просто хочу понять,верно ли я думаю,что замена всех переменных на указатели будет эффективней.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 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 равняется единице и
     //  память, занятая под массив, свободна
1
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.11.2013, 11:25 #13
Цитата Сообщение от pEntity Посмотреть сообщение
И должен удалять после каждого действия над этой переменной.
Нет конечно. Если ты удалишь данное после первого же действия с ним, то с таким же успехом его можно было и не создавать. Освобождать указатели надо в тот момент, когда завершены все действия с адресуемыми по нему данными. Не после каждого действия, а после заведомо последнего.
0
pEntity
11 / 6 / 1
Регистрация: 12.12.2012
Сообщений: 393
19.11.2013, 11:30  [ТС] #14
спасибо ребят,уже понятней стало. А вот с классами через указатель все тоже самое? И какой смысл выделять для них указатель,если я могу делать обращение к их членам через точку.
0
taras atavin
Ушёл с форума.
3569 / 1753 / 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 Посмотреть сообщение
спасибо ребят,уже понятней стало. А вот с классами через указатель все тоже самое? И какой смысл выделять для них указатель,если я могу делать обращение к их членам через точку.
Что такое "классы через указатели"? Есть классы, есть указатели, одно другому перпендикулярно. А ни каких "классов через указатели" нет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 11:38
Привет! Вот еще темы с ответами:

Удаление списка указателей - C++
Здорова! Есть задачка: Определите список указателей, который уничтожает объекты, адресуемые этими указателями, во время уничтожения...

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

Удаление содержимого указателей, хранящихся в векторе - C++
Здравствуйте! Меня озадачила одна проблема: допустим у нас есть вектор указателей, ссылающихся на класс А: vector&lt;A*&gt; va; Мы его...

по поводу указателей. Как правильно задавать массив указателей и его удалять? - C++
Т.е., например создаю указатель: TPoint *p_Point=NULL; а если массив? TPoint *p_MassPoint; //=?; как массив обнулить не ясно ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.11.2013, 11:38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru