Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
При том, что вызов невиртуального метода для NULL — совершенно нормальная с точки зрения компилятора вещь без всякого криминала — ну будет неявный параметр (this) равен NULL и что? Код внутри метода может корректно обрабатывать такие ситуации.
struct A
{
static inline int globalInt = 0;
int localInt = 0;
int foo() { if (!this) return globalInt; else return localInt; }
// сеттер не нужен для понимания идеи но пусть будет для полноты
void setFoo(int i) { if (!this) globalInt = i; else localInt = i; }
};
A *a = nullptr;
int i = a->foo();
class B { int i{0}; int j{0}; };
class С : public B, public A {};
C *c = nullptr;
int i = c->foo();
Вызов метода от nullptr это UB. Точнее, UB — это проверять this на nullptr.
nullptr — это UB, а сравнение this с nullptr легально, всегда возвращает false, и на него уже давно ругаются компиляторы как на бессмысленный код.#include <iostream>
using namespace std;
class A {
public:
void non_virtual_mem_fn() {
if (this==nullptr)
cout << "NULL" << endl;
else
cout << "NOT NULL" << endl;
}
};
int main() {
A* ptr_null = nullptr;
ptr_null->non_virtual_mem_fn();
A* ptr_not_null = new A();
ptr_not_null->non_virtual_mem_fn();
delete(ptr_not_null);
return 0;
}-O0):
Как можно и как нельзя использовать нулевой указатель в С++