2015-03-31 3 views
1

Так что стек стека не может быть освобожден вручную с помощью delete, потому что это как-то вызывает UB. Но при создании объекта производного класса задействовано «новое» ключевое слово. Скажем, например:Удалить производный класс с указателем стека?

void some_function(){ 
    Base* base; 
    base = new Derived; 
} 

как «новый» участвует, является базой = новый Derived теперь находится в куче? И если да, то должна ли память, где она находится, снова освободиться вручную? Или он находится в стеке, и память будет освобождена после завершения программы?

+1

1) Выделенная память в куче. 2) Он должен быть удален вручную. Лучше использовать интеллектуальные указатели, такие как 'std :: unique_ptr' или' std :: shared_ptr'. 3) Когда программа завершается, память освобождается. Но вы продолжаете выделять память, а не удалять, это будет утечка памяти. – Jagannath

ответ

4

Правило: Каждый раз, когда вы используете new, вы должны освободить память delete. Единственным исключением является то, что называется «размещение new», которое редко используется (см. Комментарии).

В вашем случае указатель , который называется base, сам находится в стеке. Однако то, на что он указывает, выделяется на кучу.

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

(примечание к педантам: Я использую «стек» и «кучу» здесь, как в обиход, несмотря на то, что эти термины не упоминается в стандарте C++.)

+0

Исключений нет, кроме размещения 'new'. После размещения 'new', нужно очистить, используя явный вызов деструктора, а не' delete'. –

+0

@BenVoigt: Хорошая добыча! –

+0

Подождите. ВСЕ будут освобождены? Я думал, что выделенная память кучи останется выделенной до тех пор, пока система не перезагрузится, если она не будет освобождена. –

4

При работе с указателями , не путайте память, которую занимает указатель с памятью, на которую указывает указатель.

В вашей функции base является локальной переменной функции, и она будет очищена, когда она выйдет из сферы действия. Тем не менее, память base точек на не будет.

Before allocation: 
-------- 
| base | 
-------- 
freed at end of scope 

After allocation: 
--------     --------------- 
| base | ===============> | new Derived | 
--------     --------------- 
freed at end of scope  Will not be freed 

Однако, если добавить в delete base; вашей функции:

--------     --------------- 
| base | ===============> | new Derived | 
--------     --------------- 
freed at end of function freed by "delete base;" 
+0

Хорошо, вижу. большое спасибо –

Смежные вопросы