You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
void * operatornew(std::size_t) throw(std::bac_alloc) // 다른 매개변수를 추가로 가질 수 있다.
{
usingnamespacestd;if (size == 0)
{
size = 1; // 0 바이트 요청이 들어오면 1 바이트 요구로 간주하고 처리
}
while(true)
{
size 바이트 할당
if (할당 성공)
return (할당된 메모리에 대한 포인터)
// 할당이 실패했을 경우, 현재의 new 처리자 함수가 어느 것으로 설정되어 있는지 찾는다.
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);
if(globalHandler) (*globalHandler)();
elsethrowstd::bac_alloc();
}
}
new 처리자에서 직무유기를 해버릴 경우 operator new의 내부 루프는 걸대로 스스로 끝나지 않는다.
operator new 클래스 전용 버전
classBase{
public:staticvoid * operatornew(std::size_t size) throw(std::bad_alloc);
};
classDerived : publicBase {};
derived * p = new Derived;
void * Base::operatornew (std::size_t size) throw(std::bad_alloc)
{
if (size != sizeof(base))
{
return ::operatornew(size); // 틀린 크기가 들어오면 표준 operator new 쪽에서 메모리 할당 요구를 처리한다.
}
// 맞는 크기가 들어오면 메모리 할당 요구를 여기서 처리한다.
}
sizeof(Base)와 size를 비교하는 코드에서 0바이트 점검도 함께 진행한다.
size가 0이면 if 문이 거짓이 되어 메모리 처리 요구가 ::operator new 쪽으로 넘어간다.
배열에 대한 메모리 할당을 클래스 전용 방식으로 하고 싶다면 operator new[] 함수를 구현하면 된다.
operator delete 작성 규칙
C++는 널 포인터에 대한 delete 적용이 항상 안전하도록 보장한다.
voidoperatordelete(void *rawMemory) throw()
{
if(rawMemory == 0) return; // 널 포인터가 delete되려고 할 경우에는 아무것도 하지 않는다.// rawMemory가 가리키는 메모리 해제
}
operator delete 클래스 전용 버전
삭제될 메모리의 크기를 점검하는 코드를 넣어 준다.
classBase{
public:staticvoidoperatordelete(void * rawMemory, std::size_t size) throw();
};
void Base::operatordelete(void *rawMemory, std::size_t size) throw()
{
if (rawMemory == 0) return; // 널 포인터 점검if (size != sizeof(Base)) // 크기가 틀린 경우 표준 operator delete가 메모리 삭제 요청을 맡는다.
{
::operatordelete(rawMemory);
return;
}
// rawMemory가 가리키는 메모리를 해제한다.return;
}
가상 소멸자가 없는 기본 클래스로부터 파생된 클래스의 객체를 삭제하려고 할 경우에는 operator delete로 C++가 넘기는 size_t 값이 엉터리일 수 있다.