(C++) new를 통한 객체 생성 vs 그냥 객체 생성

처음 클래스를 배우면서 객체를 생성할 때 메모리를 동적으로 할당받지 않고(new를 사용하지 않고)
객체를 생성하였다. 
클래스이름 객체이름;
ex>
Student kim;


new 연산자를 사용한 동적할당.
클래스이름 *객체이름;
객체이름 = 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>
1번을 주석 풀고 실행하게 되면 소멸자가 호출이 되고 나서 5초후에 프로그램은 종료된다. 2번을 주석 풀고 실행하게 되면 프로그램은 종료가 됬지만 소멸자는 호출이 되지 않는다. (메모리 해제가 되지 않았으므로 종료되지 않았다) 2, 3번을 주석 풀고 실행하게 되면 1번과 똑같은 현상이 발생한다. 메모리는 생성했으면 해제 해주어야 하는 습관은 C, C++에선 필수이다. C# 이나 Java는 가비지 컬렉터라고 해서 해제를 안해줘도 알아서 해제 해주는 기능을 포함하고 있다고 한다.



참고: http://multithread.tistory.com/entry/

댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기