gpt4 book ai didi

c++ - 为什么#include 在这里防止堆栈溢出错误?

转载 作者:IT老高 更新时间:2023-10-28 11:34:35 25 4
gpt4 key购买 nike

这是我的示例代码:

#include <iostream>
#include <string>
using namespace std;

class MyClass
{
string figName;
public:
MyClass(const string& s)
{
figName = s;
}

const string& getName() const
{
return figName;
}
};

ostream& operator<<(ostream& ausgabe, const MyClass& f)
{
ausgabe << f.getName();
return ausgabe;
}

int main()
{
MyClass f1("Hello");
cout << f1;
return 0;
}

如果我注释掉 #include <string>我没有收到任何编译器错误,我猜是因为它包含在 #include <iostream> 中。 .如果我在 Microsoft VS 中“右键单击 --> 转到定义”,它们都指向 xstring 中的同一行文件:

typedef basic_string<char, char_traits<char>, allocator<char> >
string;

但是当我运行我的程序时,我得到一个异常错误:

0x77846B6E (ntdll.dll) in OperatorString.exe: 0xC00000FD: Stack overflow (Parameter: 0x00000001, 0x01202FC4)

知道为什么在注释掉 #include <string> 时会出现运行时错误?我正在使用 VS 2013 Express。

最佳答案

确实,非常有趣的行为。

Any idea why I get I runtime error when commenting out #include <string>

使用 MS VC++ 编译器会发生错误,因为如果您不这样做 #include <string>你不会有operator<<std::string 定义.

当编译器试图编译 ausgabe << f.getName();它寻找 operator<<std::string 定义.由于没有定义,编译器会寻找替代方案。有一个operator<<MyClass 定义并且编译器尝试使用它,并且要使用它必须转换 std::stringMyClass这正是发生的事情,因为 MyClass有一个非显式构造函数!因此,编译器最终会创建 MyClass 的新实例。并尝试再次将其流式传输到您的输出流。这会导致无限递归:

 start:
operator<<(MyClass) ->
MyClass::MyClass(MyClass::getName()) ->
operator<<(MyClass) -> ... goto start;

为避免该错误,您需要 #include <string>确保有 operator<<std::string 定义.你也应该让你的MyClass构造函数显式以避免这种意外的转换。智慧法则:如果构造函数只接受一个参数以避免隐式转换,则使构造函数显式:

class MyClass
{
string figName;
public:
explicit MyClass(const string& s) // <<-- avoid implicit conversion
{
figName = s;
}

const string& getName() const
{
return figName;
}
};

看起来像 operator<<对于 std::string仅在 <string> 时才被定义包括在内(与 MS 编译器一起),因此一切都可以编译,但是您会得到一些意外的行为,如 operator<<正在递归调用 MyClass而不是调用 operator<<对于 std::string .

Does that mean that through #include <iostream> string is only included partly?

不,字符串已完全包含在内,否则您将无法使用它。

关于c++ - 为什么#include <string> 在这里防止堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43733672/

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