Что использование нового требует от вас также вызвать удаление? - PullRequest
0 голосов
/ 29 марта 2012

Я застрял здесь с вопросом в моей книге C ++:

«Что использование new требует от вас также вызова delete?»

Может быть, у вас есть ответ на этот вопрос?

Ответы [ 4 ]

1 голос
/ 29 марта 2012

Вызов new выделил память для объекта, а также организовал выполнение конструктора этого объекта.

Вы можете освободить память, вызвав free (), но вы должны использовать delete для освобождения памяти, выделенной new, поскольку это также приведет к выполнению деструктора объектов.

1 голос
/ 29 марта 2012

когда вы делаете new, ОС выделяет память указателю, которому вы ее назначаете. После завершения использования вы можете больше не требовать его. Но память все еще помечена как «используемая» ОС.

Теперь, когда указатель объявлен в области действия функции или любого другого блока (из {}), он будет удален (будет удален только указатель), когда закончится выполнение блока. В таких случаях память, выделенная с помощью new, остается помеченной ОС как «используемая» и не выделяется никаким другим указателям, вызывающим new, или переменной. Это приводит к появлению в оперативной памяти потерянного блока памяти, который никогда не будет использоваться, поскольку его указатель был удален из памяти, но он будет занимать блок памяти.

Это называется утечкой памяти. Несколько таких блоков также могут сделать ваше приложение нестабильным.

Вы используете delete для освобождения таких блоков памяти и освобождения ОС, чтобы ее можно было использовать для других запросов

1 голос
/ 29 марта 2012

В C ++ нет сборщика мусора, и поэтому вы несете ответственность за освобождение выделенной памяти.В любом случае, операционная система «знает», какой памяти выделена ваша программа.Поэтому, когда ваша программа завершает работу, операционная система снова отвечает за память.Но если у вас долго работает программа на C ++ и вы никогда не вызываете delete, никто не поможет вам избавиться от мусора.

1 голос
/ 29 марта 2012

Потому что так устроен C ++ и это предполагаемое поведение.
Намерение состояло в том, чтобы обеспечить выделение памяти, которой вы требуете и которой владеете, до тех пор, пока вы не откроете ее заново.

new дает вам динамическое выделение памяти (в куче), которое будет продолжать существовать, и вы владеете им, пока вы не освободите его явно, вызвав delete.
Отказ от вызова delete в new ed буфере приведет к неопределенному поведению , как правило, в форме . 1 утечки памяти.

1 Это обсуждалось здесь .

...