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
https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/malloc?view=msvc-170
'프로그래밍 언어 > C & C++ 정리' 카테고리의 다른 글
복사 생성자 (4) | 2024.11.02 |
---|---|
구조체와 클래스의 차이 (1) | 2024.11.02 |
Java와 C++의 차이로 배우는 소멸자와 const 멤버 함수 (4) | 2024.10.31 |
Java와 C++ 로 비교하는 - 초기화 리스트와 기본 생성자 (1) | 2024.10.31 |
Java와 C++/C 차이 개체 배열, 선언문 관례 (1) | 2024.10.28 |