스택 영역은 함수의 매개변수와 지역변수가 할당되는 영역으로 함수 호출 시 스택에 할당되며 함수 종료 시 자동으로 소멸한다
'new' 키워드를 사용하여 동적으로 힙 영역에 메모리를 할당한다.
따라서 'delete'하기 전까지 heap에 존재하게 된다.
그래서 동적메모리 해제를 하지않으면 소멸자가 호출되지 않음
#include <iostream>
using namespace std;
class Orange
{
private:
int price;
public:
Orange(int price)
{
this->price = price;
cout << "[생성자] 오렌지 가격 : " << price << endl;
}
~Orange()
{
cout << "[소멸자]" << endl;
}
void ShowPrice()
{
cout << "[가격] 오렌지 : " << price << endl;
}
};
void stack()
{
cout << "*** stack Orange orange(500); ***" << endl;
Orange orange(500); // stack영역
orange.ShowPrice();
}
void heap()
{
cout << "*** heap Orange *orange = new Orange(1000); ***" << endl;
Orange* orange = new Orange(1000); // heap 영역
orange->ShowPrice();
}
int main(void)
{
stack();
heap();
return 0;
}
#include <iostream>
using namespace std;
class Orange
{
private:
int price;
public:
Orange(int price)
{
this->price = price;
cout << "[생성자] 오렌지 가격 : " << price << endl;
}
~Orange()
{
cout << "[소멸자]" << endl;
}
void ShowPrice()
{
cout << "[가격] 오렌지 : " << price << endl;
}
};
void stack()
{
cout << "*** stack Orange orange(500); ***" << endl;
Orange orange(500); // stack영역
orange.ShowPrice();
}
void heap()
{
cout << "*** heap Orange *orange = new Orange(1000); ***" << endl;
Orange* orange = new Orange(1000); // heap 영역
orange->ShowPrice();
delete orange;
}
int main(void)
{
stack();
heap();
return 0;
}
heap()
함수 내에서 Orange *orange = new Orange(1000);
는 new Orange(1000);
을 통해서 heap영역에 메모리를 할당하고 그 메모리의 주소를 포인터 연산자를 통해 orange
에 저장한다. 이때, orange
는 stack영역에 할당된 변수이기 때문에 heap()
함수가 종료가 된다면 orange
라는 변수는 자동으로 소멸하고 heap영역에 할당받은 메모리만 남게되니까 heap()
함수 안에서 delete를 해줘야한다.