gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 02:16:49 24 4
gpt4 key购买 nike

此版本的代码运行良好:

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 (并将代码行替换为附近我注释掉的“字符串版本”),那么,之后编译没有问题,程序在运行时出现段错误。

创建基类对象没有问题。

调试器输出:

#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 时导致段错误。

顺便说一句:你应该得到一个编译警告。如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)
^

关于c++ - 更改一个类属性的数据类型会在构造子类对象期间导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36517474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com