C++ 기초 (new)

이찬민·2022년 11월 23일
0

new, delete는 C언어의 malloc, free와 대응되는 C++의 메모리 할당 연산자 이다.

선언하는 기본 방식은 다음과 같다.

포인터 = new 타입[(초기값)];

할당과 동시에 초기화를 하고 싶다면 초기값에 값을 넣으면 되지만 생략하여도 문제는 없다.

이렇게 할당 된 메모리를 해제할 때는 delete 연산자를 사용하는데,
형식은 다음과 같다.

delete 포인터;

만약 할당만 하고 해제를 해주지 않는다면 메모리 일부를 사용할 수 없게되는 메모리 누수 (Memory Leak) 가 발생하므로 동적 할당한 메모리는 반드시 delete 해주어야 한다.

delete는 NULL 포인터에 대해서는 아무런 동작도 하지 않기때문에 안전하다.

예제

void main()

{
     int *num = new int;

     *num = 123;

     printf("*num = %d\n",*num);

     delete num;
}

메모리 할당면에서만 본다면 malloc, free와 new, delete는 동일한데 차이점은 다음과 같다.

① malloc/free는 라이브러리가 제공하는 함수인데 비해 new/delete는 언어가 제공하는 연산자이다. 그래서 별도의 헤더 파일을 포함할 필요없이 언제든지 사용할 수 있으며 이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다. 연산자이기 때문에 사용자 정의 타입에 대해 오버로딩할 수도 있다.

② malloc 함수는 필요한 메모리양을 바이트 단위로 지정하고 void *를 리턴하므로 sizeof 연산자와 캐스트 연산자의 도움을 받아야 한다. 이에 비해 new는 할당할 타입을 지정하고 해당 타입의 포인터를 리턴하므로 sizeof 연산자와 캐스트 연산자를 쓸 필요가 없다. 할당한 타입과 같은 타입의 포인터 변수로 대입만 받으면 된다.

③ malloc은 메모리를 할당하는 것만이 목적이므로 초기값을 줄 수 없지만 new 연산자는 동적으로 생성한 변수의 초기값을 지정할 수 있다. 즉 할당과 동시에 초기화를 할 수 있는데 할당 타입 다음의 괄호에 초기값을 적어 주면 된다.

④ new 연산자로 객체를 할당할 때 생성자가 자동으로 호출된다. 생성자란 객체를 자동으로 초기화하는 특별한 함수이다. 생성자는 생성과 동시에 객체를 초기화할 수 있도록 함으로써 클래스가 기존 타입과 동등한 자격을 가지도록 하는 중요한 역할을 한다. 생성자를 호출한다는 점이 malloc과 new의 가장 큰 차이점이며 C++에서 별도의 할당 연산자가 추가된 이유이다. 마찬가지로 delete로 객체를 삭제할 때는 파괴자라는 특별한 함수가 자동으로 호출된다.

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

주의해야 할 점으로는 동적으로 할당한 배열을 삭제 할 때에는 delete문이 아닌 delete[]를 사용하여야 한다.

할당을 new[]로 받고 해제는 delete로 했을때의 동작은 정의되어있지 않으며 상황에 따라 다르다.

일반적으로는 배열의 첫번째 요소만 파괴자가 호출되고 나머지는 호출되지 않으므로 메모리 누수가 발생 할 것이다.

정리

new와 delete의 가장 큰 장점은 생성자 파괴자를 사용 가능하다는 것이고, 그것 외에는 기능적으로 malloc free와 비슷하다.
C++에서는 new와 delete를 사용하는 것을 권장하고 있지만,
반드시 그래야 하는 것만은 아니며 단순한 메모리 할당면에서는 malloc free가 더 유리하게 작용할 때도 있다.
즉 상황에 맞게 사용하는 것이 중요하다고 할 수 있다.

출처 : SoEn

profile
게임 개발자(지망생) -> WPF 개발자 -> 서버 개발자(예정)

0개의 댓글