[11-3] new, delete 연산자 오버로딩

dd_ddong·2022년 8월 14일
0

c++

목록 보기
34/38

new 연산자가 하는 일

  1. 메모리의 할당 -> 오버로딩 부분
  2. 생성자 호출
  3. 할당하고자 하는 자료형으로 형 변환

이 중 new 연산자를 오버로딩한다면 1. 메모리 할당에 해당하는 작업이 오버로딩의 대상이 된다.
나머지는 오버로딩이 불가하다.

new 연산자 오버로딩

원래 메모리 할당에 해당하는 부분을 오버로딩하기에 메모리할당에 관해 필수적으로 들어가야하는 부분이 있다.

void * operator new (size_t size)
{
	//to do
    void* adr = new char[size];
    return adr;
}
  • void* operator new (size_t size) : 이 부분은 고정이다. 매개변수로 받은 size는 할당해야하는 메모리의 크기를 알려준다.
  • //to do : 여기에 오버로딩으로 추가하고 싶은 내용을 넣으면 된다.
  • void* adr = new char[size]; return adr; : 이 부분도 고정이다. 메모리할당을 실제로 해주는 부분이다.

delete 연산자가 하는 일

  1. 소멸자의 호출
  2. 메모리 해제 -> 오버로딩 부분

delete 연산이 호출 되면 소멸자가 호출되고 메모리의 해제가 된다.
delete 연산에서 오버로딩 할 수 있는 부분은 2. 메모리 해제 이다.

delete 연산자 오버로딩

new 오버로딩과 마찬가지고 필수적으로 들어가야하는 부분이 있다.

void operator delete (void* adr)
{
	//to do
    delete []adr;
}
  • void operator delete(void* adr) : 이 부분은 고정이다. 매개변수 adr은 해제해야 할 메모리(new에서 할당한) 이다.
  • //to do : 오버로디으로 추가할 내용
  • delete []adr : 이 부분도 고정이다. 메모리 해제를 실행한다. [ ]이 붙은 이유는 메모리할당이 char형의 배열로 되기 때문이다.

    new delete 연산자 오버로딩 특징

    둘 다 객체생성 전 호출할 수 있어야 하므로 자동으로 static 선언이 추가된다.
    따라서 멤버함수가 아닌 클래스함수가 된다.

    new [], delete []

    Point pos = new Point() -> 객체
    Point pos = new Point[]() -> 객체 배열
    위와 같이 객체 생성은 두가지로 나뉠 수 있다.
    c++에서는 이 둘의 오버로딩을 따로 정의할 수 있게 operator new[] 도 있다.
void * operator new[] (size_t size)
{
	//to do
    void* adr = new char[size];
    return adr;
}

함수이름에 new 가 new[]가 된거 빼고는 모두 똑같이 정의하면 된다.

void operator delete[] (void* adr)
{
	//to do
   delete []adr;
}

delete도 마찬가지이다.

0개의 댓글