Почему компилятор C++ не устраняет проверку нуля указателя, возвращаемого new?

Недавно я запустил следующий код на ideone.com (gcc-4.3.4)

#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <new>

using namespace std;

void* operator new( size_t size ) throw(std::bad_alloc)
{
     void* ptr = malloc( 2 * 1024 * 1024 * 1024);
     printf( "%p\n", ptr );
     return ptr;
}

void operator delete( void* ptr )
{
    free( ptr );
}

int main()
{
    char* ptr = new char;
    if( ptr == 0 ) {
        printf( "unreachable\n" );
    }
    delete ptr;
}

и получил такой результат:

(nil)
unreachable

хотя new никогда не должен возвращать нулевой указатель, и вызывающая сторона может рассчитывать на это, и компилятор мог бы исключить проверку ptr == 0 и рассматривать зависимый код как недоступный.

Почему компилятор не устранил этот код? Это просто пропущенная оптимизация или есть какая-то другая причина?

8
задан sharptooth 21 November 2011 в 14:34
поделиться