Ну, вы знаете, что такое стек, верно?Если вы объявляете функцию, скажем, в C:
int foo() {
int bar = 42;
return bar;
}
Когда функция вызывается, создается некоторое пространство для информации о функции в стеке, и там также выделяется целое число bar
,Когда функция возвращается, все в этом фрейме стека освобождается.
Теперь в C ++:
class A {
int a;
int b;
A(int x, int y) {
a = x;
b = y;
}
~A() { // destructor
cout << "A(" << a << "," << b << ") being deleted!" << endl;
}
}
void foo() {
A on_the_stack(1,2);
A *on_the_heap = new A(3,4);
}
В таких языках, как Java, все объекты размещаются в куче (если компиляторкакая-то оптимизация).Но в некоторых языках, таких как C ++, объекты класса могут идти прямо в стек, как int
s или float
s.Память из кучи не используется, если вы явно не вызовете new
.Обратите внимание, что наш on_the_heap
объект никогда не освобождается (вызывая для него delete
), поэтому он вызывает утечку памяти.С другой стороны, объект on_the_stack
автоматически освобождается, когда функция возвращается, и перед этим вызывается деструктор.