Re[3]: ((SA*)0)->Func();
От: Андрей Тарасевич Беларусь  
Дата: 26.04.02 20:32
Оценка: 34 (5)
Здравствуйте DarkGray, Вы писали:

DG>Написано ли где-нибудь в стандарте, что компилятор не должен закладываться на то, что this всегда не равен нулю?


Может написано, может не написано. Это, в принципе, неважно. Стандарт вместо этого совершенно глухо запрещает все возможные пути падания внутрь метода объекта через null-указатель. А именно: запрещается разадресовывать null-указатель. Это автоматически означает, что, пока поведение программы определено, внутри метода объекта this никак не может быть равен null-указателю.

DG>А вот для обычных функций не понятно. Могу ли я в качестве this при вызове использовать произвольное значение (в частности NULL) или не могу? То есть будет это приводить к падению или не будет?


Будет приводить к неопределенному поведению. А будет падать или нет — это уже дело десятое. Твоя попытка защититься от такой ситуации путем сравнения 'this' с 'NULL' в рамках языка C++ ситуацию никак не спасает, т.к. у этому моменту ее уже поздно спасать.

Даже если некоторый компилятор все таки делает "корректный" вызов метода через null-указатель, все равно проверка 'this' на NULL в общем случае работать не будет. Т.к., например, нигде не гарантируется, что указатель 'this' базового класса совпадает с указателем 'this' класса-наследника. Даже при одиночном наследовании. А при множественном наследовании твоя проверка в принципе не способна отловить NULL. Посмотри что получится если сделать так:

struct SX { int x; };

struct SB : SX, SA {};

((SB*) 0)->Func();
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.