09-03-2020, 04:27 PM
以下代码编译可以通过,而且没有警告,但是运行时就segfault.
原因是 Top 中 vec 在 mod 之后调构造函数初始化,而 mod 在初始化的时候修改了 vec.
同理,如果没有 vec 的话,t.getv() 得到的是 456 而不是 mod 初始化时设的 123.
但是今天我调一个类似的bug的时候,编译器没报警告,address sanitizer 也没查出错误,就是运行结果错误。直到用gdb调试发现,本来预期有数据的vec的大小变成了0,再仔细分析代码,才发现了问题。
代码:
#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,再仔细分析代码,才发现了问题。