2015-01-07 1 views
2

내가 할 수 C++ Primer을 읽는 동안이 전역 :할당 자 클래스의 deallocate 메서드를 호출 할 때 포인터가 null이 될 수없는 이유는 무엇입니까?

우리가 null 일 수 없습니다 할당을 해제 전달하는 포인터; alloc에 ​​의해 할당 된 메모리는 이어야합니다.

나는 deallocate의 원인을 확인하고이 발견

// __p is not permitted to be a null pointer. 
void 
deallocate(pointer __p, size_type) 
{ ::operator delete(__p); } 

확인을, 그래서 delete 표현과 operator delete() 사이에 구별이 알고있다. delete 표현식은 널 포인터에서 사용할 수 있습니다. 그러나이 함수는 전역 operator delete() 함수를 직접 호출합니다. 그러나, 나는이 문제를 인터넷 검색과 같은뿐만 아니라 글로벌 운영자가 널 포인터에 대한 방법의 검사를 삭제 내용의 블로그 게시물 here을 발견

void 
operator delete (void* ptr) throw() 
{ 
    if (ptr) 
    std::free (ptr); 
} 

는 또한, 아이러니하게도, 나는 또한 here을 발견

A의 std::free를 호출 null 포인터가 아무런 영향을 미치지 않습니다 ... 그럼 내 질문은, __p null 포인터가 허용되지 않는 이유는 무엇입니까? documentation for std::allocator::deallocate 따르면

+1

NULL 포인터에서'delete'를 호출하는 것과 관련하여 C++ 11에서 약간의 변화가있었습니다. 주제에 대한 [내 질문] (http://stackoverflow.com/questions/25329576/calling-delete-on-null-pointers-c03-vs-c11)을 참조하십시오. –

+1

deallocator는 할당하지 않은 메모리를 할당 해제하라는 메시지를 표시 할 수 없습니다. 할당시 NULL을 반환하지 않는 사용자 정의 할당자는 NULL 할당을 요청하지 않는다고 가정 할 수 있어야합니다. – molbdnilo

답변

4

:

allocate()

는 이전에 호에 의해 얻어진 포인터이어야 포인터 (P)에 의해 참조 된 저장 장치를 해제한다. 인수 n은 원래 p를 생성 한 allocate()에 대한 호출의 첫 번째 인수와 같아야합니다.

::operator delete(void*)으로 전화를 걸지 만 호출되는시기와 방법은 지정되지 않습니다.

이 사양은 할당자가 포인터가 null이 아니라고 가정 할 수 있다고 생각합니다. 할당자를 직접 ::operator delete()에 대한 포인터를 전달하지만 모든 할당 자에 대한 경우는 그렇지 않을 수도 있습니다.

관련 문제