이유에 앞서, 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. 이 기술은 .. 아직 습득 불가!
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. 이 기술은 .. 아직 습득 불가!
'책 정리 > Effective C++ 2판' 카테고리의 다른 글
항목 12. 생성자에서 치환보다는 초기화를 사용한다. (0) | 2008.05.07 |
---|---|
항목 11. 동적으로 할당되는 메모리를 갖는 클래스를 위해서는 복사 생성자와 치환 연산자를 선언하라 (0) | 2008.05.07 |
2부까지 종료 (0) | 2008.05.07 |
항목 10. operator new를 작성한다면 operator delete도 작성한다. (0) | 2008.05.07 |
항목 9. new의 "정상"형식을 감추지 않는다. (0) | 2008.05.07 |
항목 7. 메모리가 모자랄 경우에 대비한다. (0) | 2008.05.07 |
항목 6. 소멸자에서 포인터 맴버에 대해 delete를 이용 한다. (0) | 2008.05.07 |
항목 5. new와 delete의 사용시 동일한 형식을 이용한다. (0) | 2008.05.07 |
항목 4. C++ 스타일의 주석을 지향한다 (3) | 2008.05.07 |
항목 3. malloc과 free보다는 new와 delete를 사용한다. (0) | 2008.05.07 |
최근댓글