类继承时,由于未注意基类和派生类的构造函数调用顺序导致的异常
现象
使用gdb调试运行时,某个类一旦开始构造实例,程序就挂掉,错误如下:
error initializing due to unexpected exception: basic_string::_M_construct null not valid
- 怪异的是,如果在构造时打断点停下来,然后单步调试,就不会报错,运行正常;如果不打断点,直接运行过去,就挂掉
代码如下
class Base {
public:
Base(const std::string& table_name) : table_name_(table_name) {}
private:
std::string table_name_;
};
class Drived : public Base {
public:
Drived() : Base(DbName) {}
public:
const std::string DbName{"my_db"};
};
void test() {
Drived d;
}
原因分析
构造派生类时,先构造基类。上面代码中,将派生类的成员变量传递给基类,此时,派生类还没有构造,因此传递的东西是未知的。
解决方法
- 将变量DbName声明为static类型,static变量的生命周期与程序本身的生命周期一样