C++ 在构造子类对象期间,更改一个类属性的数据类型会导致segfault

C++ 在构造子类对象期间,更改一个类属性的数据类型会导致segfault,c++,constructor,segmentation-fault,subclass,C++,Constructor,Segmentation Fault,Subclass,此版本的代码运行良好: class Object { public: // Object( string name, string state ) <-- string version Object( string name, bool state ) { this->name = name ; this->state = state ; } protected: string name ; b

此版本的代码运行良好:

class Object
{
public:

    // Object( string name, string state ) <-- string version
    Object( string name, bool state )
    {
        this->name = name ;
        this->state = state ;
    }

protected:
    string name ;
    bool state ;
    // string state ; <-- string version
};



class Tool : public Object
{
public:
    Tool(string name):Object(name,state)
    {
        this->state = true ;

        //this->state = "true" ; <-- string version
    }
};


int main ()
{

    Tool* tool = new Tool("name") ;


    cin.get() ;
    return 0 ;
}
为什么将
状态设置为
字符串会导致问题

Tool(string name):Object(name,state)
您试图使用未初始化的成员
状态
(基类
对象
受保护
成员)作为
对象
构造函数的参数,它应该由
对象
的构造函数初始化。使用未初始化的变量会导致UB,这意味着任何事情都可能发生。在您的情况下,使用
std::string
时会导致段错误

顺便说一句:你应该得到一个编译警告。比如


如何使
state
a
bool
不出现问题?它的不变大小或…?@dziadek1990
bool
是内置类型,而
std::string
是类类型,具有非繁琐的构造函数和复杂的内部构造<代码>布尔
在这种情况下可能更安全,但UB是UB,没有任何保证。
Tool(string name):Object(name,state)
source_file.cpp:28:35: warning: base class 'Object' is uninitialized when used here to access 'Object::state' [-Wuninitialized]
    Tool(string name):Object(name,state)
                                  ^