(C++) new를 통한 객체 생성 vs 그냥 객체 생성
처음 클래스를 배우면서 객체를 생성할 때 메모리를 동적으로 할당받지 않고(new를 사용하지 않고)
객체를 생성하였다.
객체를 생성하였다.
클래스이름 객체이름;
ex>
Student kim;
ex>
Student kim;
new 연산자를 사용한 동적할당.
클래스이름 *객체이름;
객체이름 = new 클래스이름;
객체이름 = new 클래스이름(매개변수 리스트);
ex>
Student *kim;
kim = new Student();
kim->showData(); //
객체이름 = new 클래스이름;
객체이름 = new 클래스이름(매개변수 리스트);
ex>
Student *kim;
kim = new Student();
kim->showData(); //
1) 객체 포인터를 선언한다.
2) new 연산자를 사용해 객체를 위한 메모리를 동적할당한다.
3) new 연산자에 의해 생성자가 자동으로 호출된다.
4) 객체 포인터를 사용해 멤버에 접근한다.
-------------------------------------------------------------------------------------------------------------------------------------
여기서 드는 의문점이 있다.
앞에서 객체를 생성할때 클래스 이름과 객체명만 적어주면 되었다.
그런데 굳이 new를 이용해서 동적할당을 받아 객체를 생성하는 이유는 무엇일까?
딱히 물어볼 곳이 없어 네이버 지식in을 통해 답을 구할 수 있었다. (나랑 비슷한 의문을 가진 사람은 항상있는듯 하다)
두 방법의 차이는 메모리의 어디에 올라가냐의 차이이다.
동적할당을 받지 않고 객체를 생성할 경우 스택영역에 올라가게 된다.
스택영역은 일반적인 변수가 올라가는 영역으로 범위를 벗어날 경우 메모리가 자동으로 해제된다.
하지만 동적할당을 할 경우 힙영역을 할당받고 delete를 이용하여 직접 해제를 해주지 않기 전까지는 메모리에 유지된다.
즉, 함수에서 잠깐 쓰고 자동으로 해제시키기 위해서는 스택 메모리를 이용하여 사용하도록 하고 계속 사용하기 위해서는 힙메모리를 이용해야 한다.
힙 메모리를 이용할 경우 메모리 누수가 발생할 수 있으므로 delete를 이용하여 해제를 해주어야 한다.
01.
#include <iostream>
02.
#include <windows.h>
03.
using
namespace
std;
04.
class
A
05.
{
06.
private
:
07.
int
a;
08.
public
:
09.
A() { };
10.
~A() { cout <<
"소멸자호출"
<< endl; }
11.
};
12.
13.
void
Instance()
14.
{
15.
// A a; 1번
16.
// A *a = new A; 2번
17.
//delete a; 3번
18.
}
19.
20.
void
main()
21.
{
22.
Instance();
23.
Sleep(5000);
24.
}
25.
</windows.h></iostream>
참고: http://multithread.tistory.com/entry/
댓글
댓글 쓰기