327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|
1 | |
Применение и удаление указателей19.11.2013, 10:32. Показов 7776. Ответов 16
Метки нет (Все метки)
Здравствуйте.
Я не могу понять сути,когда нам нужно удалить указатель для освобождения памяти. Есть указатель: int *pHealth; Функция: void SetHealth( ... ) *pHealth = 4; Данная функция вызывается на протяжении всей работы программы. Мы можем удалить указатель после *pHealth = 4 ? А так же имеет ли это вобще смысл? Или нужно создавать указатель и удалять его с целью экономии памяти после его последнего вызова всего действия программы ? Почему мы бы всегда не использовать указатели ? Я не могу понять когда и как мы можем ими маневрировать. Я хочу понять, стоит ли мне все переменные переделать под указатели с целью экономии памяти. 2) Когда мы можем и когда лучше использовать vector в место массивов? Точней когда их лучше будет применять,ведь они эффективней,например не нужно удалять их.
0
|
19.11.2013, 10:32 | |
Ответы с готовыми решениями:
16
Применение указателей Применение указателей Применение указателей, структур и объединений Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей |
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
|
|
19.11.2013, 10:44 | 2 |
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, а вы действительно так объявляете указатель в своей программе
или просто для сокращения записи так написали? Потому что, если вы при объявлении указателя таким образом, не проинициализируете его адресом какого-либо объекта данных, то в дальнейшем попытка использовать его
может привести к непредсказуемому поведению программы.
1
|
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
|
|
19.11.2013, 11:07 | 5 |
без new - нельзя.
Добавлено через 9 минут удалять нельзя. Указатель - удобный способ работы с адресами переменных. Если вы не выделяли память, то удалять не нужно.
1
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
|
19.11.2013, 11:07 | 6 |
1
|
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
|
|
19.11.2013, 11:09 | 7 |
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 |
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|||||||||||
19.11.2013, 11:20 | 10 | ||||||||||
Принудительно указатель можно удалить только в том случае, если он размещён в памяти, выделенной по указателю большей кратности, иначе его принудительно можно только освободить. Но именованные указатели удаляются и при завершении области видимости, где они объявлены, если только они не статические. Глобальные и статические указатели удаляются при завершении всей программы. Во всех случаях перед удалением указателя его надо освободить, при этом будут удалены размещённые в выделенной по нему памяти динамические данные. Исключение № 1 - если по указателю не выделялась память, тогда его не нужно освобождать перед удалением. Исключение № 2 - если указатель освобождён без связи с его удалением в связи с принятым решением о прекращении времени жизни динамических данных, тогда его не нужно освобождать непосредственно перед удалением самого указателя. Разновидность исключения № 1 - если указателю присвоен адрес памяти, выделенной не явно, или по другому указателю.
Добавлено через 2 минуты Для освобождения указателя и выделенной по нему памяти и удаления размещённых в этой памяти данных предназначены операторы
1
|
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|
19.11.2013, 11:20 [ТС] | 11 |
Да. int *pHealth = new int;
Я не могу понять когда удалять и когда применять. Я могу все переменные так заменить? И должен удалять после каждого действия над этой переменной. Я просто хочу понять,верно ли я думаю,что замена всех переменных на указатели будет эффективней.
0
|
Почетный модератор
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
|
||||||
19.11.2013, 11:22 | 12 | |||||
Не по теме: vua72, как в известном мультике "создать нельзя удалить". :D На это счет споры ведутся до сих пор. Это делается неявно. Никакой экономии не получится. А вероятность где-нибудь накосячить сильно возрастет. Хотя это все от конкретного случая зависит. Если вы хотите использовать вектор, чтобы не заморачиваться с массивом, то и по аналогии здесь - не заморачивайтесь с указателями, а используйте переменные.К разговору про области видимости:
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
19.11.2013, 11:25 | 13 |
Нет конечно. Если ты удалишь данное после первого же действия с ним, то с таким же успехом его можно было и не создавать. Освобождать указатели надо в тот момент, когда завершены все действия с адресуемыми по нему данными. Не после каждого действия, а после заведомо последнего.
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 |
Каждый указатель занимает память в размере 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 минуты Что такое "классы через указатели"? Есть классы, есть указатели, одно другому перпендикулярно. А ни каких "классов через указатели" нет.
0
|
327 / 252 / 58
Регистрация: 12.12.2012
Сообщений: 2,048
|
|
19.11.2013, 11:43 [ТС] | 16 |
Ну создают указатель,который обращается к его членам. new *pStudents = &Cstudents;
0
|
19.11.2013, 13:56 | 17 |
pEntity, и чё? В чём принципиальное отличие от int*p=new int ?
0
|
19.11.2013, 13:56 | |
19.11.2013, 13:56 | |
Помогаю со студенческими работами здесь
17
Удаление указателей на C++ удаление указателей Удаление указателей Удаление указателей из вектора Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |