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