gpt4 book ai didi

c++ - Ctor 初始化程序 : self initialization causes crash?

转载 作者:太空狗 更新时间:2023-10-29 23:24:23 27 4
gpt4 key购买 nike

我很难调试生产崩溃。只是想与这里的人确认语义。我们有一个类...

class Test {
public:
Test()
{
// members initialized ...
m_str = m_str;
}
~Test() {}
private:
// other members ...
std::string m_str;
};

有人将初始化更改为使用 ctor 初始化列表,这在我们的代码语义中是合理正确的。初始化的顺序和它们的初始值是正确的。所以类看起来像...

class Test {
public:
Test()
: /*other inits ,,, */ m_str(m_str)
{
}
~Test() {}
private:
// other members ...
std::string m_str;
};

但是代码突然开始崩溃了!我将一长串 inits 隔离到这段代码 m_str(m_str)。我通过 link text 确认了这一点.

它必须崩溃吗?标准对此有何规定? (这是未定义的行为吗?)

最佳答案

第一个构造函数等同于

  Test()
: m_str()
{
// members initialized ...
m_str = m_str;
}

也就是说,当您在构造函数中进行赋值时,m_str 已经隐式初始化为空字符串。因此,对 self 的赋值,虽然完全没有意义和多余,但不会导致任何问题(因为 std::string::operator=(),正如任何写得很好的赋值运算符都应该检查 self 赋值而不做任何事情在这种情况下)。

但是,在第二个构造函数中,您试图用初始化列表中的自身初始化 m_str - 此时它尚未初始化。所以结果是未定义的行为。

更新:对于原始类型,这仍然是未定义的行为(导致字段具有垃圾值),但它不会崩溃(通常 - 请参阅下面的异常注释),因为原始类型由定义没有构造函数、析构函数,也不包含指向其他对象的指针。

同样适用于任何不包含具有所有权语义的指针成员的类型。 std::string 特此证明不是其中之一:-)

关于c++ - Ctor 初始化程序 : self initialization causes crash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3892098/

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