프로그래밍 언어/C & C++ 정리

new와 malloc의 차이

뽀또치즈맛 2024. 11. 1. 13:16

 

C++ new 및 delete는 연산자이다.

C스타일 malloc은 라이브러리에 내장된 함수이다.

 

할당 연산자인 new의 기본 형식은 다음과 같다.

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

 

즉, 차이점은 다음과 같다.

 

1. malloc/free는 라이브러리가 제공하는 함수인데 비해

new/delete는 언어가 제공하는 연산자이다.

그래서 별도의 헤더 파일을 포함할 필요없이 언제든지 사용할 수 있다.

이 연산자를 쓴다고 해서 프로그램이 커지는 것도 아니다.

연산자이기 때문에 사용자 정의 타입에 대해 오버로딩 할 수도 있다.

 

사용자 정의 타입 오버로당 예시

// microsoft 출저
class MyClass
{
public:
   void * operator new[] (size_t)
   {
      return 0;
   }
   void   operator delete[] (void*)
   {
   }
};

int main()
{
   MyClass *pMyClass = new MyClass[5];
   delete [] pMyClass;
}

 

2. malloc 함수는 필요한 메모리양을 바이트 단위로 지정하고 

void *를 리턴하므로 sizeof 연산자와 캐스트 연산자의 도움을 받아야 한다.

 

이에 비해 new는 할당할 타입을 지정하고 해당 타입의 포인터를 리턴하므로

sizeof 연산자와 캐스트 연산자를 쓸 필요가 없다.

 

즉 반환 값과 sizeof 연산자 캐스트 연산자의 유무이다.

 

malloc에 대해 정확히 말하자면

 

malloc은 할당된 공간에 대한 void 포인터를 반환하거나 

NULL 사용 가능한 메모리가 부족한 경우 반환한다. 

void가 아닌 형식에 대한 포인터를 반환하려면 반환 값에 형식 캐스팅을 사용한다.

 

3. malloc은 메모리를 할당하는 것만이 목적이므로 초기값을 줄 수 없지만

new는 동적으로 생성한 변수의 초기값을 지정할 수 있다.

 

    // malloc
    
    // 동적 할당 (실행 시 메모리를 할당하고 싶을 때)
    char *path_dynamic = (char *)malloc(PATH_MAX * sizeof(char));
    if (path_dynamic == NULL) {
        perror("메모리 할당 실패");
        return 1;
    }
	// 여기서 경로 배열 사용 (예제)
    snprintf(path, PATH_MAX, "/example/path/to/file.txt");
    snprintf(path_dynamic, PATH_MAX, "/another/example/path/to/file.txt");
    
    
    // new
    int *pi=new int; *pi=123; 두 문장은 int *pi=new int(123);

 

 

참고 문헌

https://learn.microsoft.com/ko-kr/cpp/cpp/new-and-delete-operators?view=msvc-170

 

new 및 delete 연산자

C++ 언어의 new 및 delete 연산자를 사용하면 할당을 제어할 수 있습니다.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/malloc?view=msvc-170

 

malloc

자세한 정보: malloc

learn.microsoft.com

http://soen.kr/lecture/ccpp/cpp3/25-2-3.htm