Давайте говорить все же с позиции ЯЗЫКА С/С++
По Страуструпу -
+ удаление неинициализированого указателя НЕДОПУСТИМО
А инициализация указателя на структуру в NULL/0 и последующая попытка удаления неверна опять же с позиции языка C/C++, потому как 0 не указывает на реально существующие данные в памяти, что требуют правила языка.
Если мы говорим о компиляторах, то это их дело, как трактовать исходный текст при компиляции... Кто-то false в 1 ставит, кто-то в -1... Если юниксовому компилятору вроде бы глубоко плевать на различие между флагами "r" и "rb", то языку - нет. Так что, если писать правильно и грамотно с позиций языка, то все должно работать тип-топ независимо от компилятора. А если мы уж равняемся на определенный компилятор, то никаких слов о совместимости кода быть не может.
кстати, этот код под виндой вызовет ошибку памяти, потому как менеджер памяти в компиляторе VC не различает неинициализированый указатель и нулевой. И поступает правильно.