今天阅读书籍,上面写了一句话,“得到一个空指针,继续调用成员函数会导致程序崩溃”。
这句话似乎写的比较草率。我在实践中有过空指针调用成员函数不崩溃的情况,当然,用空指针去调用成员函数,肯定是不合理的。只不过,不一定会崩溃。
比如:
class A
{
public:
void func(bool a)
{
std::cout << "A::func()" << std::endl;
if (a)
{
std::cout << m_i << std::endl;
}
}
private:
int m_i = 0;
};
如果这样调用:
A *a = nullptr;
a->func(true);
那么的确会崩溃。但是如果是 a->func(false);
则不会崩溃。原因是没有用到成员变量,也就是没有读取非法地址。仅仅调用一个函数,是合法的,函数的地址是静态的,所有的对象的成员函数地址都一样。