티스토리 뷰

Programing/C++

C++ new, delete / 스택과 힙

live2skull 2016. 8. 8. 13:40

C언어 _ new, delete

흔히 동적 배열을 위해 메모리를 할당받거나, 해제할 때 쓰는 malloc과 free와 비슷하게 사용된다. (둘다 힙 메모리 영역을 할당하게 된다.)



사용방법

int *ptr_malloc = (int *)malloc(sizeof(int) * 4); // with malloc

int *ptr_new = new int[10]; // with new


! 동적으로 할당(malloc, new)를 해준 메모리 영역은 반드시 사용이 끝나면 각각 free, delete로 초기화를 해주어야 한다.

! new나 malloc통해 생성하지 않은 클래스, 구조체는 스택에 할당된다.


메모리 해제 시:

free(ptr_malloc);

delete ptr_new[]; // delete의 경우에 대상이 배열인 경우, 뒤에 "[]"를 붙여주지 않으면 처음 데이터 크기(idx=0)만 초기화된다. 사용에 주의.



malloc과 new의 차이

1. malloc은 기본 라이브러리 제공 함수로, 함수 콜을 요청하지만, new는 c++에서 제공하는 기본 키워드로, 별도의 라이브러리 추가없이 바로 사용이 가능하다.

사실 거의 차이가 없는 내용이다. (별도 라이브러리 추가만 하는거 빼고)

실제로, new를 사용해 메모리를 할당받는 과정에서도 어셈블리 단에서는 operator 함수 콜을 사용하게 된다.

2. 데이터 초기화 및 사용 시 유의점.

malloc의 경우, 배열을 선언하고자 한다면 그 크기에 유의하여야 한다. 인자로 받는 값이 "바이트 크기" 이기 때문에, 만약 int형 배열 5개를 선언받기를 원한다면, 

malloc(sizeof(int) * 5); 

와 같은 형태로 sizeof의 도움을 받아 크기가 1바이트가 아닌 자료형들을 배열로 할당받는데 유의하여 사용하는게 좋다.

추가로, malloc의 리턴 타입은 void* 이기 때문에, 명시적인 캐스팅으로 포인터를 받아야 한다.

또한, malloc을 통해 할당받는 메모리 값은 초기화가 되어있지 않은 쓰레기 값이 들어있으므로, memset 을 통해 따로 초기화해야 할 필요가 있다.

new의 경우, new 뒤에 오는 자료형에 맞추어 크기를 자동으로 설정해주며, 초기화도 자동으로 해주며, 캐스팅을 사용하지 않아도 된다.

3. 재할당

malloc으로 할당받은 메모리는 데이터를 그대로 유지하면서 realloc을 이용해 메모리의 크기를 변경할 수 있다. (시스템 상황에 따라 새로 만들어지기도 함)

new로 할당받은 메모리는 그 크기를 변경할 수 없고, 원하는 크기의 메모리를 새로 할당받은 다음에 복사하고, 이전 메모리를 해제해야 한다.



+ 스택과 힙.

(이전에 정리했지만 다시 재정리)

* 기본적으로 사용자가 컨트롤 할지, 프로그램이 컨트롤 할지와 크기가 정해지는 시점이 컴파일이 되는 시점인지, 런타임이 되는 시점인지에 대한 차이점이 있다.

Stack:

Call stack 등의 사용으로, 컴파일시에 그 크기가 정해진다. (Pass argument, ret ptr, stack frame ptr)

new, malloc과 같은 동적 메모리 할당(heap)을 사용하지 않으면 스택에 생성되게 되며, 이 때 컴파일시 크기 할당이 불가능한 이유가 바로 이것이다.

사용할 수 있는 크기가 작게 제한되어 있다.

Heap:

동적할당에 쓰이며, Stack에 비해 상대적으로 사용할 수 있는 크기가 크다.

사용 후 반드시 해제를 해 주어야 함. (이 부분에 대해 나중에 다시 자세히 설명)


참고:

http://drunkenpsycho.tistory.com/13

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함