Содержание
- 1 GPU и VRAM — самый важный фактор в играх
- 2 Какой объем ОЗУ оптимален для игрового компьютера
- 3 Серийный номер оперативной памяти
- 4 Как увеличить файл подкачки в Windows 7, 8, 10?
- 5 malloc
- 6 Процесс выделения памяти под объекты
- 7 Доступность более 4 Гб оперативной памяти в Windows
- 8 Чистка диска
- 9 Увеличиваем объём оперативной памяти на компьютерах
- 10 Висячие указатели
GPU и VRAM — самый важный фактор в играх
Графические процессоры имеют встроенную оперативную память, называемую VRAM, сокращенно для видеопамяти. VRAM — это быстрая форма флэш-памяти, которая хранит визуализированную графику и другие данные для обработки и отправки графическим процессором в CPU.
В отличие от обычной оперативной памяти, чем больше VRAM у видеокарты, и чем быстрее, тем лучше игровой процесс. Не менее важны и сами графические процессоры. Современные итерации предлагают более совершенные внутренние наборы микросхем и алгоритмы, которые более эффективны при рендеринге графики.
Для повышения частоты кадров обновление графического процессора считается наиболее эффективным решением. Уже рассматривали невероятные улучшения от небрежных 20 FPS до захватывающих 100 FPS для многих игр.
Например, для сравнения, обновление GeForce GTX 950 с 1 ГБ видеопамяти на GeForce RTX 2080 с 11 ГБ повлияет на игры гораздо больше, чем переключение с 8 ГБ ОЗУ на 16 ГБ ОЗУ.
Какой объем ОЗУ оптимален для игрового компьютера
Любая компьютерная игра является программой, исполняемой EXE-файлом, в процессе ее активности осуществляется непрерывная обработка большого объема информации и использование дополнительных графических библиотек. По этой причине оперативную память следует рассматривать одной из важных составляющих любой геймерской системы.
При выборе игрового компьютера первое, на что следует обращать внимание — объемы оперативной памяти. На ней лучше не экономить, поскольку недостаточные размеры ОЗУ скажутся не только на комфорте игрового процесса, но и на успешности в реализации игровых миссий
Емкости, достаточной для обычной работы в офисных программах и интернете, недостаточно для стабильной работы большинства современных игр.
В параметрах любой современной компьютерной игры прописываются требования к ОЗУ. На сегодняшний день для компьютера геймера оптимальным является емкость оперативной памяти от 8 до 16 ГБ: эти объемы позволяют комфортно запускать большую часть игр, не закрывая при этом все работающие программы и процессы устройства.
На большинстве современных игровых компьютеров производителями установлены системы 8 или 16 Гбайт. В наиболее распространенных процессорах AMD и Intel применяются двухканальные контроллеры ОЗУ, благодаря чем на материнской плате каждой платформы установлены 2 или 4 слота DIMM. Материнские платы с разъемами LGA2011 и LGA2011-v3 располагают 4 или 8 разъемами соответственно для подключения ОЗУ.
Что происходит, если объемов оперативной памяти компьютера недостаточно
В тех случаях, когда компьютерной игре не хватает имеющегося объема оперативной памяти и данные в ОЗУ не помещаются, часть информации переносится на виртуальную память — на так называемый «файл подкачки».
Главной проблемой загрузки игры с файла подкачки является низкая скорость работы жесткого диска: показатель оперативности ОЗУ в несколько раз превышает аналогичный параметр виртуальной памяти. Это непосредственно отражается на игровом процессе: пользователь постоянно сталкивается с торможением игры, регулярными лагами и зависаниями на несколько секунд.
Таким образом, сама игра загрузится в любом случае, даже если ОЗУ компьютера недостаточно для ее запуска. Однако прохождение важных игровых моментов и в целом игровой процесс будут сопровождаться регулярным торможением и зависанием.
- Наиболее серьезной данная проблема будет для геймеров, играющих в онлайн-игры («Дота», «Танки» и другие РПГ): зависание на стороне одного из игроков может привести к поражению как всей команды, так и пользователя при соло-игре, например, при нападение со стороны другого игрока, когда отразить атаку невозможно из-за лагов процесса.
- В одиночных играх, не предполагающих участие других игроков, торможение менее критично и сказывается на удобстве и комфорте самого игрока. Для прохождения определенного участка ему потребуется потратить больше времени и, возможно, предпринять несколько попыток.
Серийный номер оперативной памяти
Влияние оперативной памяти на игры странная делема — это крайность и разочарование. Если в системе недостаточно оперативной памяти, скажем, 4 ГБ, например, ОЗУ окажет значительное ощутимое влияние на игру, т.е. В игре будет меньше памяти для загрузки наборов данных (игровой движок, текстуры, уровни, освещение, и так далее. Меньше памяти приравнивается к более быстрой загрузке игровой графики и низким показаниям кадров в секунду.
Простое решение заключается в том, чтобы добавить больше оперативной памяти, но есть только столько оперативной памяти, которую вы можете добавить, прежде чем она достигнет порогового значения и будет эффективно использована. Два фактора определяют, к чему относится этот порог и как он может колебаться.
Во-первых, сколько оперативной памяти запрограммировано для конкретной игры. Если в игре используется максимум 4 ГБ, то наличие 8 ГБ ОЗУ означает, что фактически есть 4 ГБ, которые никак не исползуются.
Второй фактор заключается в том, запускаются ли приложения вместе с игрой, если таковые имеются. Мы говорим о потоковом программном обеспечении, таком как OBS, веб-браузеры, программное обеспечение для записи и любые другие программы, которые открыты одновременно с игрой.
Если никакие вторичные приложения не запущены, то требование к базовой оперативке для запущенной игры, представляет собой максимальный порог для ОЗУ, который считается стабильным.
Когда геймер запускает множество приложений в фоновом режиме (музыка, чат, потоковое программное обеспечение и т.д.), То чем больше оперативной памяти в дополнение к базовым требованиям игры, тем лучше.
Этот пункт особенно актуален для стримеров, которые запускают несколько программ для длительных сеансов трансляций, хотя другие бенефициары включают графических дизайнеров или видеоредакторов, которые хотят оставить программы, требующие ОЗУ, открытыми во время игры.
В современной игровой среде от 8 до 16 ГБ более чем достаточно для комфортного запуска подавляющего большинства игр. По мере того, как разработчики используют возможности увеличения объема ОЗУ, эта тенденция направлена увеличение в соответствии со стандартными объемами оперативки, обнаруживаемыми в ПК, которые постепенно увеличиваются с течением времени. Тесты указывают, что переход с 8 ГБ до 16 ГБ в лучшем случае незначителен, но есть много смысла в проверке вашей системы в будущем, особенно если ОЗУ дешевеет.
Также существует множество типов модулей ОЗУ, такие как DRAM, SRAM, DRAM и другие… Все они отличаются друг от друга не только размером контактной части но и специализацией.
Как увеличить файл подкачки в Windows 7, 8, 10?
Не хватает оперативной памяти (ОЗУ) для работы в интернете или запуска современной игры? Прежде чем увеличивать ее объем, попробуйте настроить файл подкачки. Вполне возможно, что ваш ПК или ноутбук станет работать гораздо шустрее. О том, что это такое и как включить файл подкачки в Windows 7, 8 или 10 читайте ниже.
Что такое файл подкачки?
Сначала чуточку теории. Файл подкачки – это специальный файлик, к которому Виндовс обращается, если ПК не хватает текущей ОЗУ для работы. Проще говоря, это виртуальная память, которая приплюсовывается к текущей, в результате чего улучшается скорость работы ноутбука или компьютера.
Приведу простой пример. Вы хотите включить игру, которая требует 4 Гб оперативной памяти. А у вас лишь 3 Гб. Что делать в таком случае? Увеличить виртуальную память и недостающие 1 Гб Windows «возьмет» из этого специального файлика. Таким способом вы сможете запустить игру и поиграть в нее.
Разумеется, здесь есть несколько моментов:
- Увеличение виртуальной памяти может тормозить работу компьютера. Ведь скорость доступа к ОЗУ гораздо быстрее, чем к жесткому диску (а именно на нем хранится файл подкачки).
- Использование этой функции создает лишнюю нагрузку на HDD-накопитель и сокращает время его работы.
Как увеличить виртуальную память в Windows 7
Для этого:
- Перейдите в Пуск – Панель управления – Система.
- Щелкните на «Доп. параметры».
- Найдите раздел «Быстродействие» и щелкните на «Параметры».
- В новом окошке выберите вкладку «Дополнительно».
Появится то самое окошко, где вы сможете настроить файл подкачки.
По умолчанию здесь стоит галочка в пункте «Автоматически выбирать объем…». Это оптимальный вариант – рекомендуется выбирать именно его.
Если же ПК или ноутбук тормозит, значит, оперативной памяти не хватает и ее надо увеличить. Для начала уберите галочку в этом пункте. Все кнопки станут активными, и вы сможете включить файл подкачки в Windows 7 и настроить его на свое усмотрение. Для этого поставьте галочку возле строки «Указать размер» и пропишите исходный и макс. объем. Например – 4096 Мб (это 4 Гб).
Важно: во избежание тормозов и глюков исходный и макс. размер должны быть одинаковыми
Например, 4096 Мб (как на скриншоте выше).
Кстати, какой оптимальный размер файла подкачки? Советов по этому вопросу в интернете очень много, да и формулы расчета тоже замысловатые.
Оптимальным вариантом будет увеличить виртуальную память компьютера на 50% от объема вашей ОЗУ. То есть, файл подкачки для 4 Гб будет составлять 2048 Мб. А для 8 Гб ОЗУ можно указать 4096 Мб. В результате суммарная память будет составлять 6 и 12 Гб соответственно – этого должно хватить на все случаи жизни.
После того как вы добавили виртуальной памяти, нажмите «ОК» и перезагрузите ПК или ноутбук. Ведь изменения будут применены только после перезагрузки.
Если на ПК установлено много ОЗУ (например, 8 Гб), и вы работаете только в интернете, тогда можете вообще отключить файл подкачки. Ведь, как я говорил выше, он нагружает жесткий диск, что иногда замедляет работу ПК.
Впрочем, этого делать не рекомендуется. Возможно, через время вы захотите запустить игру или обработку видео, и выскочит ошибка, что не хватает памяти. А о виртуальной памяти, скорее всего, благополучно забудете. В результате потратите много нервов, прежде чем устраните эту проблему.
В общем, если вам нужно увеличить виртуальную память в Windows 7 – укажите ее вручную. А если потребуется восстановить прежние значения, поставьте галочку в самом первом пункте и закройте это окно.
Файл подкачки в Windows 8 настраивается аналогично (как и в «семерке»)
А чтобы не заходить в Пуск и не открывать множество окон, можно поступить проще:
- Нажмите Win + R.
-
Пропишите sysdm.cpl и щелкните Enter.
- Выберите вкладку «Дополнительно» и зайдите в «Параметры».
- Щелкните на вкладку «Дополнительно», а затем – на кнопку «Изменить».
Кстати, данная команда работает также и в «семерке». Для удобства можете использовать этот способ при необходимости.
Готово. Дальше осталось только настроить файл подкачки в Windows 8. Чтобы включить виртуальную память, пропишите желаемый объем, щелкните «ОК» и выполните перезагрузку ПК или ноутбука.
malloc
В предыдущей главе уже обсуждалось, что локальные переменные кладутся на стек и существую до тех пор, пока мы не вышли из функции.
С одной стороны, это позволяет автоматически очищать память, с другой стороны, существует необходимость в переменных, время жизни которых мы можем контролировать
самостоятельно. Кроме того, нам необходимо динамическое выделение памяти, когда размер используемого пространства заранее не известен. Для этого используется
выделение памяти на куче. Недостатков у такого подхода два: во-первых, память необходимо вручную очищать, во-вторых, выдеение памяти – достаточно дорогостоящая операция.
Для выделения памяти на куче в си используется функция malloc (memory allocation) из библиотеки stdlib.h
void * malloc(size_t size);
Функция выделяет байтов памяти и возвращает указатель на неё. Если память выделить не удалось, то функция возвращает NULL.
Так как malloc возвращает указатель типа void, то его необходимо явно приводить к нужному нам типу. Например, создадим указатель, после этого выделим память размером в 100 байт.
#include <conio.h> #include <stdio.h> #include <stdlib.h> void main() { int *p = NULL; p = (int*) malloc(100); free(p); }
После того, как мы поработали с памятью, необходимо освободить память функцией free.
Используя указатель, можно работать с выделенной памятью как с массивом. Пример: пользователь вводит число – размер массива, создаём массив этого размера и заполняем
его квадратами чисел по порядку. После этого выводим и удаляем массив.
#include <conio.h> #include <stdio.h> #include <stdlib.h> void main() { const int maxNumber = 100; int *p = NULL; unsigned i, size; do { printf("Enter number from 0 to %d: ", maxNumber); scanf("%d", &size); if (size < maxNumber) { break; } } while (1); p = (int*) malloc(size * sizeof(int)); for (i = 0; i < size; i++) { p = i*i; } for (i = 0; i < size; i++) { printf("%d ", p); } _getch(); free(p); }
Разбираем код
p = (int*) malloc(size * sizeof(int));
Здесь – приведение типов. Пишем такой же тип, как и у указателя. – сколько байт выделить. – размер одного элемента массива.
После этого работаем с указателем точно также, как и с массивом. В конце не забываем удалять выделенную память.
Теперь представим на рисунке, что у нас происходило. Пусть мы ввели число 5.
Выделение памяти.
Функция malloc выделила память на куче по определённому адресу, после чего вернула его. Теперь указатель p хранит этот адрес и может
им пользоваться для работы. В принципе, он может пользоваться и любым другим адресом.
Когда функция malloc «выделяет память», то она резервирует место на куче и возвращает адрес этого участка. У нас будет гарантия, что компьютер не отдаст нашу память кому-то ещё.
Когда мы вызываем функцию free, то мы освобождаем память, то есть говорим компьютеру, что эта память может быть использована кем-то другим.
Он может использовать нашу память, а может и нет, но теперь у нас уже нет гарантии, что эта память наша. При этом сама переменная не зануляется, она
продолжает хранить адрес, которым ранее пользовалась.
Это очень похоже на съём номера в отеле. Мы получаем дубликат ключа от номера, живём в нём, а потом сдаём комнату обратно. Но дубликат ключа у нас остаётся.
Всегда можно зайти в этот номер, но в нём уже кто-то может жить. Так что наша обязанность – удалить дубликат.
Иногда думают, что происходит «создание» или «удаление» памяти. На самом деле происходит только перераспределение ресурсов.
Процесс выделения памяти под объекты
- Если размер объекта превышает 32 Кб, он признаётся большим, память под него выделяется непосредственно из mheap.
- Если размер объекта меньше 16 Кб, используется механизм mcache, который называется tiny allocator.
- Если размер объекта находится в пределах 16-32 Кб, то выясняется, какой класс размера (sizeClass) нужно использовать, затем в mcache выделяется подходящий блок.
- Если в sizeClass, соответствующем mcache, нет доступных блоков, производится обращение к mcentral.
- Если у mcentral нет свободных блоков, тогда обращаются к mheap и выполняется поиск наиболее подходящего mspan. Если размер памяти, необходимый приложению, оказывается большим, чем можно выделить, запрошенный размер памяти будет обработан так, чтобы можно было бы возвратить столько страниц, сколько нужно программе, сформировав новую структуру mspan.
- Если имеющейся у приложения виртуальной памяти всё равно не хватает, производится обращение к операционной системе за новым набором страниц (запрашивается минимум 1 МБ памяти).
Доступность более 4 Гб оперативной памяти в Windows
Интернет буквально завален рассуждениями пользователей о том, почему в битной Windows доступно 3,5 Гб оперативно памяти вместо, например, установленных 4 Гб. Было придумано множество теорий, мифов и легенд. Например, считают, что это ограничение, сделанное Microsoft, которое можно снять. Это отчасти правда — принудительное ограничение действительно есть. Только снять его корректно нельзя. Это обусловлено тем, что в 32-разрядных системах драйвера и программы могут нестабильно работать при использовании системой больше четырех гигабайт оперативной памяти. Для 64-битных Windows драйвера тщательнее тестируют, вышеупомянутого ограничения там нет.
В 32-битной Windows доступно только 4 Гб оперативной памяти, в 64-битной такого ограничения нет и доступно гораздо больше оперативной памяти — до 192 Гб.
Но не все так просто. Windows 7 Начальная (Starter) (и ее аналог у Vista) не видит больше 2 Гб оперативной памяти. Это тоже ограничение, только не по причине нестабильно работающего софта. Дело в том, что Windows 7 Начальная распространяется исключительно на маломощных нетбуках, по факту практически бесплатно, поэтому необходимо было дистанцировать ее от более дорогих изданий: Домашней базовой, Домашней Расширенной, Максимальной и т.д. Часть ограничений Windows 7 Starter можно снять, но только не ограничение на два гигабайта оперативной памяти.
Что касается остальных 32-битных изданий Windows XP, Vista, 7 и Windows 8/10: на практике пользователю доступно еще меньше — 3,5 Гб. Все дело в том, что драйвера тоже имеют свои адреса, которые лишают программы Windows доступа к части памяти в 512 мегабайт. Существует патч, позволяющий «задвинуть» такие адреса за пределы четырех гигабайт, чтобы система стала использовать все 4 Гб оперативной памяти, но это практически не имеет смысла:
- Как я писал выше, драйвера и программы не смогут корректно работать после такого патча, так что система может начать зависать, выдавать ошибки, т.е. вести себя непредсказуемо.
- Даже если в компьютере будет установлено плат оперативки на 8, 16, 32 Гб или больше — это никак не поможет их задействовать в 32-битном режиме операционной системы.
Какой смысл от доступности дополнительных 512 Мб оперативной памяти, если система станет нестабильной? Может, стоит поступить проще и наконец-то поставить 64-битную Windows?
То, что «видно» 4 Гб оперативной памяти, не значит, что ее можно эффективно использовать. Проблема в том, что 32-битная Windows не может грамотно выделить процессу (программе) более двух гигабайт физической оперативной памяти. Об этом многие забывают, и зря
Неважно, сколько оперативной памяти в компьютере, если программе нельзя дать больше 2 Гб ОЗУ. Пример: если пользователь работает в 32-битной Windows с Photoshop на компьютере с 4 Гб оперативной памяти, графический редактор сможет задействовать всего лишь два гигабайта максимум, остальные данные скинет в файл подкачки и будет тормозить
С играми то же самое.
На самом деле, только в 64-битной операционной системе программы могут задействовать весь потенциал оперативной памяти объемом больше двух гигабайт. И то не все, а только рассчитанные на использование больше 2 Гб ОЗУ. Ситуацию опять-таки можно исправить с помощью соответствующих патчей в 32-битной Windows, но это работает далеко не со всеми программами. Повторюсь: только 64-битная Windows и 64-битные программы, запущенные в ней — единственный выход задействовать весь потенциал большого объема ОЗУ.
Между тем, с серверными версиями Windows ситуация иная: там доступны гораздо большие объемы оперативной памяти даже в 32-битных версиях ОС. Почему так происходит, рассказано в статье Преодолевая границы Windows: физическая память от Марка Руссиновича.
Также есть моя заметка в статье про установку Windows 7 для новичков.
Чистка диска
Однако не забывайте о том, что на системном диске постепенно скапливается много разного «мусора». Это временные программки, приложения, файлы, которые требуется периодически удалять, поскольку весь этот «хлам» занимает место на ЖД и тормозит систему. Для того чтобы очистить жесткий диск, не нужно обладать какими-то особыми познаниями. Достаточно воспользоваться возможностями специальной утилиты, которая очистит и дефрагментирует диск быстро и качественно. Таких программ существует достаточно много, и все они эффективны.
Установите программу на свой компьютер и запустите ее, нажав на кнопку «Поиск». Утилита начнет производить анализ системы вашего компа, а потом предложит отметить галочками файлы и программы, подлежащие удалению. Вы удивитесь, но таковых достаточно много, причем их можно удалять безо всяких последствий для дальнейшей работы на компьютере. Перечень рекомендуемых пунктов для удаления можно найти в Интернете. Отметьте эти пункты и нажмите на кнопку «Очистить». Вам тут же будет сообщено, сколько места на диске освободится после удаления.
Во время анализа системы, удаления «мусора» и дифрагментации вы можете продолжать работать на компьютерном устройстве. Если комп при этом будет притормаживать, не пугайтесь: после очистки его быстродействие существенно ускорится.
Не забывайте чистить диск время от времени, чтобы мусор не накапливался, так как его количество рано или поздно перейдет в «качество» — и вам потребуется много времени, чтобы освободить диск. Приятной вам работы!
Увеличиваем объём оперативной памяти на компьютерах
Начнём с азов – первым делом мы должны идентифицировать тип памяти, установленной в данный момент. Грубо говоря, есть лишь четыре её разновидности – от DDR1 и до DDR5. Основные различия заключаются в максимальной частоте, на которой она функционирует и объёме памяти. Есть два способа, которые помогут Вам узнать, какой именно тип памяти установлен на материнской плате Вашего компьютера. Начнём с наиболее интересного:
- Раскрутите системный блок, снимите основную крышку;
Достаньте оттуда планку оперативной памяти (не забудьте про разжимы сверху и снизу, их необходимо сдвинуть, чтобы ничего не сломать); Итак, если планка у Вас в руках, посмотрите к какому типу она относится – на одной из сторон должна быть указана эта информация; Если у Вас компьютер 3-5-тилетней давности, скорее всего, там стоит ОЗУ типа DDR3 с частотой 1333 МГц.
Второй способ не такой интересный, но предельно простой – программный:
-
Скачиваете программу под названием CPU-Z с официального сайта;
Запускаете скачанный файл и устанавливаете утилиту. Этот процесс мы объяснять не будем, так как там всё предельно понятно на интуитивном уровне – пару кликов по кнопке «Next», а затем «Install»; Теперь Вам нужно запустить программу от имени Администратора. Для этого кликните по значку на рабочем столе правой кнопкой мыши и выберите соответствующий пункт в выпадающем контекстном меню; Как только программа запустится, перейдите ко вкладке «Memory» (она же – «Память», подразумевается именно оперативная);
В поле «Type» указан тип ОЗУ, в нашем случае – это DDR3, наиболее распространённая в течении последних нескольких лет. На данный момент считается устаревшей, потому что выпустили более мощную память следующего поколения. Поле «Size» говорит нам о размере установленной памяти – то есть, четыре гигабайта. Поле «Channels» говорит нам о том, что она работает в одноканальном режиме.
Собственно говоря, нужную нам информацию мы получили. Время двигаться дальше.
Висячие указатели
Язык C++ не предоставляет никаких гарантий относительно того, что произойдет с содержимым освобожденной памяти или со значением удаляемого указателя. В большинстве случаев, память, возвращаемая операционной системе, будет содержать те же значения, которые были у нее до освобождения, а указатель так и останется указывать на только что освобожденную (удаленную) память.
Указатель, указывающий на освобожденную память, называется висячим указателем. Разыменование или удаление висячего указателя приведет к неожиданным результатам. Рассмотрим следующую программу:
#include <iostream>
int main()
{
int *ptr = new int; // динамически выделяем целочисленную переменную
*ptr = 8; // помещаем значение в выделенную ячейку памяти
delete ptr; // возвращаем память обратно в операционную систему, ptr теперь является висячим указателем
std::cout << *ptr; // разыменование висячего указателя приведет к неожиданным результатам
delete ptr; // попытка освободить память снова приведет к неожиданным результатам также
return 0;
}
1 |
#include <iostream> intmain() { int*ptr=newint;// динамически выделяем целочисленную переменную *ptr=8;// помещаем значение в выделенную ячейку памяти delete ptr;// возвращаем память обратно в операционную систему, ptr теперь является висячим указателем std::cout<<*ptr;// разыменование висячего указателя приведет к неожиданным результатам delete ptr;// попытка освободить память снова приведет к неожиданным результатам также return; } |
В программе, приведенной выше, значение , которое ранее было присвоено динамической переменной, после освобождения может и далее находиться там, а может и нет. Также возможно, что освобожденная память уже могла быть выделена другому приложению (или для собственного использования операционной системы), и попытка доступа к ней приведет к тому, что операционная система автоматически прекратит выполнение вашей программы.
Процесс освобождения памяти может также привести и к созданию нескольких висячих указателей. Рассмотрим следующий пример:
#include <iostream>
int main()
{
int *ptr = new int; // динамически выделяем целочисленную переменную
int *otherPtr = ptr; // otherPtr теперь указывает на ту же самую выделенную память, что и ptr
delete ptr; // возвращаем память обратно в операционную систему. ptr и otherPtr теперь висячие указатели
ptr = 0; // ptr теперь уже nullptr
// Однако, otherPtr по-прежнему является висячим указателем!
return 0;
}
1 |
#include <iostream> intmain() { int*ptr=newint;// динамически выделяем целочисленную переменную int*otherPtr=ptr;// otherPtr теперь указывает на ту же самую выделенную память, что и ptr delete ptr;// возвращаем память обратно в операционную систему. ptr и otherPtr теперь висячие указатели ptr=;// ptr теперь уже nullptr // Однако, otherPtr по-прежнему является висячим указателем! return; } |
Есть несколько рекомендаций, которые могут здесь помочь:
Во-первых, старайтесь избегать ситуаций, когда несколько указателей указывают на одну и ту же часть выделенной памяти. Если это невозможно, то выясните, какой указатель из всех «владеет» памятью (и отвечает за её удаление), а какие указатели просто получают доступ к ней.
Во-вторых, когда вы удаляете указатель, и, если он не выходит из области видимости сразу же после удаления, то его нужно сделать нулевым, т.е. присвоить значение (или nullptr в С++11). Под «выходом из области видимости сразу же после удаления» имеется в виду, что вы удаляете указатель в самом конце блока, в котором он объявлен.
Правило: Присваивайте удаленным указателям значение 0 (или nullptr в C++11), если они не выходят из области видимости сразу же после удаления.