请看一下这个简单的代码:
// A.h
#pragma once
#include <iostream>
class A
{
public:
A();
~A();
int a;
private:
};
A::A() :a{3}
{
}
A::~A()
{
std::cout << 42 << std::endl;
}
在Main.cpp中我有一个全局函数:
// Main.cpp
#include "A.h"
A GlobalGetAByValue(){
static A a{};
return a;
}
int main(){
A a = GlobalGetAByValue();
int val;
std::cin >> val;
return 0;
}
现在很有趣 - 如果在关闭按钮的控制台中我在A的析构函数中有一个例外。如果我输入一些值并按Enter键 - 控制台将无异常关闭。如果我将变量 a 初始化为局部变量,或者如果我使用 new 关键字创建指针并在返回之前将其删除,则一切正常。
所以当我使用静态A时,我只在析构函数中遇到此 cout 错误。但为什么呢?
答案 0 :(得分:0)
正如它在C ++ 03标准的第3.6.3节“终止”中所述:
“静态存储持续时间的初始化对象的析构函数(在块作用域或命名空间作用域中声明)是从main返回并由于调用exit而被调用的结果。”
所以,我可以提出一个建议,当析构函数被调用时,没有任何有效的ostream对象(在这种情况下就像cout)。