이유에 앞서, C++ operator new 와 operator delete의 관례란?
1. 올바른 인자값을 가져야 한다.
2. 메모리가 충분하지 않을때 에러처리 함수를 호출해야 한다.
즉, 사용 가능한 메모리가 없을 때 요구에 대처해야 한다.

이유
1. 부모 클래스에 선언한 operator new(new[])를 상속 받은 자식 클래스는 부모클래스의 new를 호출한다.
(이때 오버라이딩은 되지 않는다. 문법 기초다. 그래서 오버로딩을 해서 쓰는데, 역시 오버로딩의 한계가있다)

 하지만 대개 자식 클래스는 부모클래스보다 메모리를 더 많이 차지하므로, 자식클래스의 메모리 할당시 부모클래스의 용량(메모리)로 잡을수도 없는 노릇이다.

부모클래스의 용량을 포함하는 자식클래스의 용량의 할당이 올바른 반환값이다.
한마디로, 상속받은 자식 클래스의 용량(메모리)가 올바른 인자값이다.


해결 방법
operator new의 경우 관례를 따르면 operator new[]도 동일
1. 부모클래스에서 operator new의 인자값으로 할당받을것에 대한 할당크기 받는다.
2. 부모클래스의 크기(sizoof로 용량 확인)와 인자값(할당크기)를 비교한다.
3. 틀릴 경우 인자값(할당크기)로 전역 new로 할당하고 그 메모리를 리턴한다.
4. 같을 경우 인자값(할당크기)로 부모클래스 operator new로 할당하고 그 메모리를 리턴한다.

operator delete의 경우 관례를 따르면 operator delete[] 도 동일
1. 부모클래스에서 operator delete의 인자값으로 void* 와 할당크기를 받는다.
2. void형 포인터가 0이면, 그냥 종료 한다.(덧붙여 2번 참조)
3. 할당크기와 부모클래스의 크기를 비교한다.
3. 틀릴 경우 전역 delete로 void* 를 할당크기(인자값)만큼 해체한다.
4. 같을 경우 부모클래스 operator delete로 void* 를 할당크기(인자값)만큼 해체한다.

덧붙여
1. 아무 데이터도 없는 클래스라 할지라도 1Byte 이다.
그러므로, new로 클래스의 객체 생성지 최소한 1Byte 할당을 보장해야 한다.

2. C++가 널 포인터를 지우것은 안하다는것을 보장한다.


개인적 생각
operator new와 operator delete는 실무에서 직접 정의해 사용하는 경우가 발생할것으로 판단된다.
1. 상속관계에서 단 1번의 메모리 할당을 해야 할때 필요하기 때문에(성능과 편리함 때문일것으로 판단된다)
2. 디버깅 때문에 (실무에서 디버깅 못하면, 정말 큰일이다!!!!!!!)
3. 이 기술은 .. 아직 습득 불가!
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요