gpt4 book ai didi

c++ - 访问不正确创建的变量的无限循环

转载 作者:行者123 更新时间:2023-12-05 08:28:48 26 4
gpt4 key购买 nike

为什么会进入无限循环,为什么会转储 char 0x20?

#include <iostream>

struct Outer {
Outer(std::string &outerString,
std::string &superfluousString1,
std::string &superfluousString2) :
outerString(outerString),
inner(*this) {}

struct Inner {
Inner(Outer &outer) {
std::cout << outer.outerString;
}
} inner;

std::string &outerString;
};

int main() {
std::string
outerString("outerString"),
superfluousString1("superfluousString1"),
superfluousString2("superfluousString2");

Outer outer(outerString, superfluousString1, superfluousString2);

return 0;
}

我在玩内部类时发现了这个 whist。 C++ 不是主要语言,我是从一个长期的中断中来到这里的,所以我问这个是为了提高我的知识。我知道在正确创建 Outer 之前我不应该使用它,所以这通常是一件非常糟糕的事情。我觉得真正的答案很可能只是因为我没有编译器错误并不意味着某些事情是正确的。

一个有趣的旁注是,如果我删除任何一个多余的字符串,我会得到一个编译器错误,或者它只会出现段错误,而这正是我所期望的。我从我正在玩的一个更复杂的结构中归结出来,所涉及的元素似乎是引起这种 react 所需的最低限度。

最佳答案

I do know that I should not be using the fields of Outer before it has been properly created

不一定。您不能在初始化之前使用成员,但可以使用已经初始化的成员来初始化其他成员。问题是成员是按照声明的顺序初始化的,而不是按照它们出现在初始化列表中的顺序。 innerouterString 之前声明,因此总是先初始化。

I feel that the real answer is likely that just because I do not have a compiler error does not mean that something is correct.

这是正确的,您有未定义的行为,因为您在初始化之前访问了一个引用 (outerString)。如果您启用了警告(带警告的 see it online),您的编译器应该警告您。

An interesting side note is that, if I remove either of the superfluous strings, I get a compiler error or it will simply segfault, and that is kind of what I had expected it to do.

未定义行为是未定义的,任何事情都可能发生。 For me ,来自一个编译器的程序不打印任何内容并正常退出,来自不同编译器的程序打印大量空格然后崩溃。


您可以通过重新排序您的成员 (see it online) 使其工作:

struct Outer {
Outer(std::string &outerString, std::string &superfluousString, std::string &innerString): outerString(outerString), inner(*this) {}

std::string &outerString; //declared before 'inner'
struct Inner {
Inner(Outer &outer) {
std::cout << outer.outerString;
}
} inner;
};

关于c++ - 访问不正确创建的变量的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74539336/

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