C++ 虚函数调用崩溃问题分析

2017-08-17  本文已影响45人  Strong_Liu

最近帮同事排查了一个崩溃问题,用他的话说是一个「神奇的」崩溃问题。

这个问题大概是这样的。
同事在 A 类写了一个函数 doSomething,然后在某个地方调用。
代码简化如下:

class A
{
public:
    void doSomething()
    {
        printf("class A doSomething! \n");
    }
};

A *a;
a->doSomething();

是的,一切正常。

然后由于 A 类是基类,而这个函数其他子类可能需要重载实现。于是,就加上了 virtual 关键字,看样子一切正常。

class A
{
public:
    virtual void doSomething()
    {
        printf("class A doSomething! \n");
    }
};

A *a;
a->doSomething();

「神奇的」事情发生了,程序崩溃在了调用 doSomething 的地方。

同事陷入了深深的迷茫中。。。

经过一番 debug,真想终于水落石出。原因是对象 a 在调用 doSomething 的时候已经被其他地方赋为了空指针。

既然 a 是空指针,那么为什么不加 virtual 关键字的时候,调用 doSomething 就一切正常呢?

这是因为:


(完)

上一篇 下一篇

猜你喜欢

热点阅读