在构造子类对象的过程中,更改一个类属性的数据类型会导致segfault



此版本的代码运行良好:

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(并用我注释掉的附近的"字符串版本"替换代码行),那么,在没有问题的编译之后,程序在运行时会给出segfault。

创建基类对象时没有问题。

调试器输出:

#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(基类Objectprotected成员)作为Object的构造函数的参数,它应该由Object的构造函数初始化。使用未初始化的变量会导致UB,这意味着任何事情都可能发生。在您的情况下,使用std::string时会导致段故障。

BTW:你应该得到一个编译警告。比如用-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)
                                  ^

相关内容

  • 没有找到相关文章

最新更新