更改一个 class 属性的数据类型会在构造子 class 对象期间导致段错误

Changing data type for one class attribute causes a segfault during construction of a subclass object

这个版本的代码运行良好:

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 ;
}

...但是如果我将 state 属性设置为 string (并将代码行替换为我注释掉的附近 "string versions" )然后,在编译之后没问题,程序在运行时出现段错误。

创建基础 class 对象时没有问题。

调试器输出:

#0 0x45b74c std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&) () (??:??)
#1 ??   ?? () (??:??)

为什么将 state 设为 string 会导致问题?

Tool(string name):Object(name,state)

您正在尝试使用未初始化的成员 state(基础 class Objectprotected 成员)作为 Object的构造函数,它应该由Object的构造函数初始化。使用未初始化的变量会导致 UB,这意味着任何事情都可能发生。在您的情况下,它会在使用 std::string.

时导致段错误

顺便说一句:你应该得到一个编译警告。比如clang with -Wall.

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)
                                  ^