8. Customizing new and delete

operator new와 operator delete를 커스터마이징하는 방법을 알아보자.

49. Understanding the behavior of the new-handler.

operator new는 메모리 할당을 할 수 없을 때 new 핸들러가 존재할 경우 이를 호출한다. 커스텀 new 핸들러는 다음 중 하나를 수행해야 한다. 더 많은 메모리를 사용 가능하게 하거나, 새로운 new 핸들러를 설치하거나, new 핸들러를 해제하거나, 예외를 던지거나, 프로그램을 종료시켜야 한다. nothrow new는 필요 없다.

  • set_new_handler 함수는 메모리 할당을 할 수 없을 때 호출될 수 있는 함수를 특정할 수 있게 해 준다.
  • 예외를 던지지 않는 new는 기능이 제한되어 있다. 이는 메모리 할당에만 적용되고, 그에 이어지는 생성자 호출은 여전히 예외를 던질 수 있다.

50. Understand when it makes sense to replace new and delete.

기본 new와 delete를 어떤 상황에서 대체할 수 있을까? 활용 오류를 감지하기 위해, 효율성을 높이기 위해, 기본 메모리 관리자의 공간 오버헤드를 줄이기 위해, 기본 할당자의 비최적 메모리 정렬을 보강하기 위해, 서로 관계 있는 오브젝트를 가까이 위치시키기 위해, 동작에 유연성을 주기 위해, 메모리 사용 통계를 수집하기 위해 대체할 수 있다. 꼭 필요한 경우가 아니라면 하지 말자.

  • 커스텀 버전의 new, delete를 쓸 이유는 여러 가지 있다. 성능 개선을 위해서, 힙 사용 에러를 디버깅하기 위해서, 힙 사용 정보를 모으기 위해서.

51. Adhere to convention when writing new and delete.

operator new와 operator delete를 대체하고자 한다면 기존의 컨벤션을 잘 따르라.

  • operator new는 메모리를 할당하기 위한 무한 루프를 담고 있어야 한다. 메모리 요청을 만족시킬 수 없으면 new 핸들러를 호출해야 하며, 0 바이트에 대한 요청도 만족시켜야 한다. 클래스 특유의 버전은 예측보다 더 많은 블록에 대한 요청도 만족시킬 수 있어야 한다.
  • operator delete는 널 포인터를 받았으면 아무것도 하지 말아야 한다. 클래스 특유의 버전은 예측보다 더 많은 블록에 대한 요청도 만족시킬 수 있어야 한다.

52. Write placement delete if you write placement new.

placement new를 썼다면 그에 맞는 placement delete도 정의해줘야 한다. 메모리 누수의 가능성을 막기 위해서이다. 이는 placement new 중 예외가 던져졌을 때만 호출된다. 클래스 특유의 버전을 쓸 때 일반 버전을 숨기지 않도록 주의하라.

  • placement new를 썼다면 그에 맞는 placement delete도 정의해 줘야 메모리 누수가 발생하지 않는다. 그렇지 않다면 예외가 던져졌을 때 미묘한 메모리 누수가 발생할 수 있다.
  • placement new delete를 쓸 때, 일반 버전의 이름을 의도치 않게 가리지 않도록 주의하라.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중