걱정마세요

invisible_thorn·2025년 4월 28일
0
post-thumbnail

동적할당을 할 때 c언어에서 malloc이라는 함수를 사용한 것을 기억하시나요?

int main()
{
	void* pData = malloc(100);
    
    // 동적할당으로 생성된 메모리 공간을 해제하는 함수
    free(pData);
}

왜 자료형을 void*로 주었느냐,
float이나 int를 넣으면, char형과 같이 1바이트 메모리를 할당하고 싶을 때 메모리 낭비가 생깁니다.

동적할당 함수 malloc는 입력된 크기(바이트 단위)만큼 힙 영역에 메모리를 할당한 후, 그 시작 주소를 반환합니다.

반환 타입은 void*입니다.
malloc을 호출한 사용자가 해당 공간을 어떤 용도로 사용할지 알 수 없기 때문이지요.

memory leak 발생
동적할당을 하고, 프로그램이 종료될 때까지 해당 공간을 해제하지 않고 프로그램이 종료된 경우

그런데 우리 c++에서는 동적할당 시 malloc 함수를 사용하지 않습니다.
왜 일까요?

c++에는 생성자와 소멸자를 개념이 추가되었습니다.
객체를 만들었을 때 우리는 생성자가 자동으로 호출되지만, malloc으로 동적할당을 할 시, 생성자를 호출해주지 못합니다.
malloc과 free는 요청된 크기만큼 동적할당하고, 알려준 주소를 메모리 해제시키기 때문에 해당 공간이 어떤 목적으로 사용되고 있는지 알 수 없습니다.
또한 malloc(정수)로 표현이 되는데
어떻게 클래스 객체를 시작 주소로 해서 생성자를 호출해줄 수 있을까요.

이를 해결하기 위해 newdelete라는 템플릿 기반 키워드가 등장했습니다.

MyClass* pNewMy = new MyClass;
delete pNewMy;

malloc과 생성자 호출,
free와 소멸자 호출까지 해주는 템플릿을 통해 c++는 동적할당을 구현할 수 있게 되었습니다.

0개의 댓글