2013년 7월 8일 월요일




c++의 메모리 할당 연산자로 new 다음 할당 대상 타입을 밝히면 타입만큼의 메모리가 할당되고 할당된 포인터가 리턴된다 new는 동적으로 메모리를 할당하므로, delete를 통하여 해제하지 않으면 메모리 누수(Memory Leak)가 발생한다.

new&delete는 c의 malloc&free와 유사한 함수이나 차이점을 가지고 있다. 
  1. mallco/free는 라이브러리 제공함수 vs new/delete는 언어가 제공하는 연산자이며, 헤더파일이 필요없다. 또한 사용자 정의 타입으로 오버로딩도 가능하다. 
  2. malloc 함수는 필요한 메모리양을 바이트 단위로 지정하고 void*를 리턴하므로 sizeof연산자와 cast연산자의 도움을 받아야 한다. 이에 비해 new는 할당 타입을 지정하고 포인터를 리턴하므로 sizeof,cast 필요없음할당타입과 같은 타입의 포인터 변수로 대입받으면 된다. 
  3. malloc은 메모리 할당이 목적이지만, new의 경우 동적으로 생성한 변수의 초기값을 지정할 수 있다. 즉 생성 동시에 초기화 가능 
  4. new 연산자로 객체를 할당할 때 생성자가 자동으로 호출되며, 이를 통해 클래스가 기존 타입과 동등한 자격을 가지도록 하는 중요한 역할을 한다. 마찬가지로 delete로 객체를 삭제할 땐 파괴자가 자동으로 호출된다.


동적 메모리 할당 
c에서는 malloc(), realloc(), calloc()의 3가지가 있다. 
c++에서는 new 연산자를 사용한다. 
ex) int* num = (int*) malloc(sizeof(int)); //int형 동적 메모리 생성 
     char* ptr = (char*) malloc(sizeof(char)*10); //크기가 10인 char형 메모리 생성 
함수원형 
void* malloc(size_t size); 
동적 메모리 할당 
char* p = NULL; 
p = (char*) malloc(10); 
할당된 메모리는 이름을 
가지지 않으므로 포인터에 저장 
int* p = (int*) malloc(sizeof(int)); 
*p = 10; 
메모리 해제는 free 
free(p); 

calloc() : malloc와 동일하지만 할당 후 메모리를 0으로 초기화 
ex) void* calloc(size_t num, size_t size); 
realloc() : 이전에 할당된 동적 메모리의 크기를 조정하는 함수 
ex) void* realloc(void* memblock, size_t size); 
free() : 동적으로 할당받은 메모리를 해제한다. 
ex) void free(void* memblock); 
memset() : 메모리 영역을 지정한 값으로 초기화 
ex) void* memset(void* s, int c, size_t n); 

0 개의 댓글:

댓글 쓰기