반드시
malloc/free
,new/delete
,new[]/delete[]
짝을 맞춰서 할당하고 해제해야 한다.<aside> ❓ 짝을 맞추지 않는 경우 어떤 문제가 발생하는가?
new[]
로 생성한 클래스 배열을delete
로 제거하는 경우 첫 번째 클래스를 제외한 모든 클래스의 소멸자가 호출되지 않아 메모리 누수가 발생할 수 있다. </aside>
전역 객체
: 프로그램이 종료되는 시점에 소멸자가 호출된다.지역 객체
: 해당 함수가 종료되는 시점에서 소멸자가 호출된다.동적 객체
: delete / delete[] 호출 시 소멸자가 호출된다. (free는 소멸자 실행X)malloc
/free
: 힙 관리자를 통해 넘긴 인자만큼의 메모리 공간을 할당받고 해제한다.new
/delete
: 내부적으로 malloc/free를 호출하며 추가적으로 생성자와 소멸자를 호출한다.new[]
/delete[]
: new/delete와 비슷하지만 소멸자가 있는 타입은 할당 구조가 다르다.void main()
{
int* p1 = (int*)malloc(sizeof(int));
*p1 = 1;
int* pArr1 = (int*)malloc(sizeof(int)*2);
pArr1[0] = 0;
pArr1[1] = 1;
free(p1);
free(pArr1);
}
void main()
{
int* p2 = new int;
*p2 = 2;
int* pArr2 = new int[2];
pArr2[0] = 2;
pArr2[0] = 3;
delete p2;
delete [] pArr2;
}
void * malloc(size_t size);
void free(void* memblock);