1 분 소요

new

new, delete는 malloc, free에 대응되는 c++ 메모리 할당 연산자이며 실행중에 메모리를 할당하는 점에서 용도가 비슷하다

포인터 = new 타입[초기값];
할당된 메모리를 헤제할 때는 delete 연산자를 사용하는데 해제할 포인터를 delete 다음에 지정한다. 해제를 하지 않으면 메모리 일부를 사용할 수 없게 되는 메모리 누수가 발생하므로 반드시 delete를 해야한다. 한 포인터에 대해 delete를 두 번 하는 것은 안되지만 NULL 포인터를 삭제하는 것은 가능하다.

void main()
{
    // new와 delete
     int *pi = new int;
     *pi = 123;  
     printf("*pi = %d\n",*pi);
     delete pi;

     // malloc과 free
     int *pi2 = (int *)malloc(sizeof(int));
     *pi2=123;
     printf("*pi2 = %d\n",*pi2);
     free(pi2);
}

new/delete는 malloc/free와 동일하지만 차이점도 많이 있다. 메모리를 관리하는 방식이 훨씬 더 진보적이며 속도도 빠르고 OOP에 적합한 특징들을 많이 가지고 있다.

  1. malloc/free는 라이브러리가 제공하는 함수인데 비해 new/delete는 언어가 제공하는 연산자이다. 그래서 별도의 헤더파일을 포함할 필요 없이 언제든지 사용할 수 있으며 이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다.
  2. malloc 함수는 필요한 메모리양을 바이트 단위로 지정하고 void *를 리턴하므로 sizeof 연산자와 캐스트 연산자의 도움을 받아야 한다.
  3. malloc은 메모리를 할당하는 것만이 목적이므로 초기값을 줄 수 없지만 new 연산자는 동적으로 생성한 변수의 초기값을 지정할 수 있다. 즉 할당과 동시에 초기화를 할 수 있는데 할당 타입 다음의 괄호에 초기값을 적어 주면 된다.
  4. new 연산자로 객체를 할당할 때 생성자가 자동으로 호출된다. 이는 malloc과 new의 가장 큰 차이점이며 C++에서 별도의 할당 연산자가 추가된 이유이다. 마찬가지로 delete로 객체를 삭제할 때는 파괴자라는 함수가 자동으로 호출된다.
  • new로 배열을 할당했다면 new[]는 delete[]로 해제해야 한다.