WeHack BBS
注意C++类元素初始化顺序的问题 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 程序设计讨论区 (https://bbs.wehack.space/forum-14.html)
+--- 主题: 注意C++类元素初始化顺序的问题 (/thread-180.html)



注意C++类元素初始化顺序的问题 - vimacs - 09-03-2020

以下代码编译可以通过,而且没有警告,但是运行时就segfault.

代码:
#include <iostream>
#include <vector>

using namespace std;

class Top;

class Module
{
    Top *t;
public:
    Module(Top *t);
};

class Top
{
    Module mod;
    vector<int> vec;
    int v;
public:
    Top();
    void setv(int v_) { v = v_; }
    int getv() const { return v; }
    void push(int i) { vec.push_back(i); }
    size_t size() const { return vec.size(); }
};

Module::Module(Top *t_):
    t(t_)
{
    t->setv(123);
    t->push(456);
}

Top::Top():
    mod(this),
    v(456)
{
}

int main()
{
    Top t;
    cout << t.getv() << endl;
    cout << t.size() << endl;
}

原因是 Top 中 vec 在 mod 之后调构造函数初始化,而 mod 在初始化的时候修改了 vec.

同理,如果没有 vec 的话,t.getv() 得到的是 456 而不是 mod 初始化时设的 123.

但是今天我调一个类似的bug的时候,编译器没报警告,address sanitizer 也没查出错误,就是运行结果错误。直到用gdb调试发现,本来预期有数据的vec的大小变成了0,再仔细分析代码,才发现了问题。