vptr

Tuesday, Jul 24, 2018 | 1 minute read | Updated at Tuesday, Jul 24, 2018

@
vptr

struct 中初始函数中,直接memset,如

struct Content{
    char indexx[64];
    //....

    void init()
    {
        memset(this, 0, sizeof(Content));
    }
};

最近代码遇到成员变量较多,想采用类似方法,但程序总是崩溃,发生在基类析构函数。

打印发现虚指针空,因为基类析构函数一般时虚函数(原因请参见effectiv C++),子类中存在vptr

摘用侯捷《度探索C++对象模型》中的实例

class A {
public:
    virtual void vfunc1();
    virtual void vfunc2();
    void func1();
    void func2();
    virtual ~A();
private:
    int m_data1, m_data2;
}; 

class B : A {
public:
    virtual void vfunc1();;
    void func2();
    virtual ~B();
private:
    int m_data3;
};

class C : B {
public:
    virtual void vfunc1();
    void func();
private:
    int m_data1, m_data4;
};

vprt.jpg

使用本文开头的方法memset初始化成员时,也同时将vptr置为空,导致析构时空指针异常崩溃。

可以在memset时偏移一个指针的长度。

© 2016 - 2025 Caisong's Blog

🌱 Powered by Hugo with theme Dream.

About Me

大龄程序员,喜欢折腾各种环境部署、软件应用。

博客记录日常。