본문 바로가기
카테고리 없음

할당 연산자 new 해제 연산자 delete

by 코리늬 2018. 3. 13.

new 연산자


자바에서는 new 연산자를 객체를 생성할 때 주로 사용한다.

c언어에서의 동적할당은 malloc함수를 사용한다

c++ 에서는 new 연산자는 주로 동적 메모리를 할당할 때 주로 사용한다.


사용할 자료의 크기를 미리 알 수 있다면 정적 할당이 편하다.

하지만 얼마나 필요한지 모를 때가 더 많다. 이러한 문제를 해결하기 위해 동적 메모리 할당을 한다.


자료형의 포인터 변수 = new 자료형[배열갯수]; 로 사용한다.

또한 이렇게 동적으로 할당된 메모리는 자동으로 없어지지 않기 때문에 프로그래머가 지워줘야 한다.

지울 때 사용하는 명령어가 delete이며

단일 메모리일 경우 : delete 변수명;

배열 메모리일 경우 : delete [] 변수명; 의 형태로 사용한다.


왜 동적 배열은 delete를 해야하는지는 c/c++이 메모리를 어떻게 사용하는지 알아야한다.

크게 힙과 스택 두 가지 방식으로 메모리를 관리한다.

예를들어 main에서 int 자료형 2개를 사용한다.

int a     int  b

그리고 함수 func()에서 지역변수로 int 자료형 1개를 더 사용한다.

int a     int  b    int c

함수가 종료되어 지역변수인 int c의 메모리 할당이 취소된다.

int a     int  b

현재 사용하는 메모리는 8바이트지만 int c는 스택에 그대로 보존된다.

(그래서 레퍼런스 변수로 지역변수를 리턴받아도 값을 출력할 수 있는 것이다.)


하지만 힙은 순차적으로 관리되는 영역이 아니라 값이 사용중인지 아닌지 알 수가 없다.

그래서 사용자가 지워주지 않으면 int c는 프로그램이 종료될 때 까지 계속 남아있게 된다.

이러한 이유로 delete를 해주는 것이다. 그렇지 않으면 메모리 누수가 일어나고 컴퓨터가 점점 느려질 것이다.


또 new, delete 연산자는 클래스를 동적할당/해제 하면서 생성자/소멸자를 호출해준다.


클래스 내에서 동적할당을 할 경우에는 멤버변수로 포인터 변수를 만들고, 꼭 생성자가 아니더라도 멤버함수나 어디서든 원하는 때에 동적할당을 하고나서 소멸자에서 해제해주면 된다.


댓글