-
[c++] New 그리고 malloc( ) 구분할 수 있어?뜯고 또 뜯어보는 컴퓨터/씨쁠쁠 C++ 2022. 11. 8. 12:41반응형
c++에서 메모리를 할당하려면, new 키워드로 메모리를 할당하고, 메모리를 해제하려면 delete 키워드로 메모리를 해제해줍니다. 마치 c 언어에서 malloc( )과 free( )를 사용하는 것처럼 비슷하게 사용합니다. 하지만 C++에서는 new와 delete의 작동법은 조금 다르게 작동하는데 이에 대해 알아보겠습니다.
0. new 그리고 delete 사용법
우선 new와 delete는 연산자의 일종입니다. (malloc( )과 free( )는 함수의 일종입니다.) 따라서, new 연산자는 operator new( )라는 특별한 연산자 함수를 호출하며, delete 또한 마찬가지로 operator delete라는 특별한 연산자 함수를 호출하게 됩니다.
우선 다음과 같이 new 연산자를 사용할 수 있는데,
char *pch = new char[BUF_SIZE];
이때, 컴파일러는 operator new라는 함수를 호출하게 됩니다. 이때 할당된 메모리에 대한 포인터가 리턴되고, 이때 new의 리턴 값을 무시하거나 메모리를 담았던 포인터를 잊어버리거나(위의 pch) 그러면, 메모리 누수가 일어나게 됩니다.
또한 메모리가 할당이 실패한 경우, 기본적으로 프로그램을 종료하게 되는데, 익셉션(exception)이 발생하지 않는 버전의 new를 쓸 수 돼있습니다. 이 버전에서는 익셉션 대신 nullptr 을 반환합니다. 따라서 메모리가 부족해서 nullptr을 리턴하는지 안 하는지 체크해줘야 합니다.
char *pch = new(nothrow) char[BUF_SIZE];
operator new( ) 를 오버 로딩해서, 사용할 수 도 있는데, 이는 나중에 글로 작성해보도록 하겠습니다. 오늘은 malloc과 new의 차이점에 대해서만 알아보겠습니다.
1. new 그리고 malloc 차이점
특징 new / delete malloc / free 함수 여부 연산자 함수 함수 생성자 객체 생성 / 생성자 객체 생성 X exception 여부 memory 할당이 불가능할시 exception NULL return overloading 여부 연산자 오버로딩 가능 오버로딩 불가능 세부사항 객체를 몇개 생성할 할 것인지 설정 가능 메모리 byte 로 할당 둘 사이의 제일 큰 특징은 메모리를 할당 후, 객체를 생성하는지 안 하는지 그리고, 생성자 및 소멸자를 부르는지 안 부르는지 그 차이점이 존재할 것입니다. 또한 malloc과 같은 경우, 지정한 바이트 수만큼 메모리를 할당하게 되지만, new와 같은 경우, 객체 생성에 필요한 바이트 수를 지정할 필요는 없습니다.
free( ) 와 delete의 관계도 이와 비슷한데, free( ) 의 경우 객체의 소멸자를 호출하지 않는 반면, delete의 경우, 소멸자를 호출해서 객체를 정상적으로 제거하게 됩니다. 이렇게 동적 메모리를 관리하기 위한 방법으로 malloc / free , new / delete 키워드를 알아보았는데요, 도움이 되셨으면 좋겠습니다.
긴 글 읽어주셔서 감사합니다.
잘못된 내용이 있거나, 도움이 되셨다면 댓글 부탁드리겠습니다!
반응형'뜯고 또 뜯어보는 컴퓨터 > 씨쁠쁠 C++' 카테고리의 다른 글
[c++] delete[] 가 포인터를 받아도 잘 동작하는 이유(over-allocate) (0) 2022.11.09 [c++] 너 .. 혹시 생성자에서 가상함수 호출할거야 ? (2) 2022.11.09 [객체의 관계] Is-A 그리고 Has-A 관계 ! (0) 2022.11.08 [c++] 상속을 어떻게 멈출 수 있을까 ? (0) 2022.11.06 왜 c에는 이동 연산자가 없는가. (0) 2022.11.03