В моей программе я не использую malloc () или free (). Я делаю экземпляры своих классов с новыми, и я убедился, что каждый из них запускает свой деструктор при удалении,
Это страшно. Вам не нужно заставлять что-либо запускать свой деструктор. Он размещен (новый), уничтожен (удален), конструктор автоматически запускается при новом, а деструктор запускается автоматически при удалении.
однако, нет вызовов free () и даже не устанавливаются их указатели (на вещи внутри глобальной области видимости или другие классы) в NULL или 0.
Нет необходимости использовать malloc / free в коде C ++ (есть несколько ситуаций, когда вы используете библиотеки lib, которые требуют неправильно загруженной памяти, но они явно задокументированы и немногочисленны).
Технически нет необходимости устанавливать указатель на NULL после его удаления.
Это хорошая техника для переменной выходить из области видимости сразу после ее удаления, чтобы ее нельзя было случайно использовать повторно. Если по какой-то причине переменная-указатель живет (то есть не выходит из области видимости) в течение длительного времени после вызова delete, полезно установить ее в NULL, чтобы она не была случайно использована повторно.
Должен ли я в любом случае использовать malloc () и free ()? Должен ли я указывать NULL на то, что я все еще хочу существовать?
Нет и нет.
Примечание: C ++ в отличие от Java не отслеживает, сколько указателей указывают на объект.
Если у вас есть несколько указателей, указывающих на объект, вам нужно использовать умные указатели (вы все равно должны использовать умные указатели).
Второй вопрос: почему, когда я смотрю на диспетчер задач, мой процесс никогда не «сбрасывает» память? Раньше никогда не прекращал набирать, а потом я начал все удалять правильно. Или так я думал.
Приложение никогда не возвращается обратно в ОС (на большинстве ОС в обычных ситуациях).
Таким образом, память никогда не будет уменьшаться (до тех пор, пока приложение не закроется).
Внутренне управление памятью отслеживает все освобождения, так что память может быть повторно использована.
Но если он закончится, он запросит у ОС больше, и, следовательно, в диспетчере задач выделение памяти увеличится (это не будет возвращено ОС).
Не приведет ли к освобождению () или удалению использование памяти?
номер
Какую практику следует использовать для освобождения памяти и освобождения памяти с помощью связанных списков?
Вы должны использовать Умные указатели , чтобы вам не приходилось беспокоиться о том, когда удалять объект.
Они также делают ваше исключение кода безопасным.
Но если вы используете указатели. вызовите delete, чтобы удалить элемент, затем установите для него значение NULL (область указателя жива еще долго после вызова удаления).
Примечание: boost: shared_pointer очень похож на указатель Java. Он отслеживает количество указателей и удаляет объект при уничтожении последней ссылки на объект. Вам не нужно ничего удалять (точно так же, как в Java), и все, что вам на самом деле нужно, это вызывать новое (как в Java).