ReferenceReturn.exe中未处理的异常:

时间:2014-08-15 08:40:42

标签: c++

请看一下这个简单的代码:

// 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 错误。但为什么呢?

1 个答案:

答案 0 :(得分:0)

正如它在C ++ 03标准的第3.6.3节“终止”中所述:

“静态存储持续时间的初始化对象的析构函数(在块作用域或命名空间作用域中声明)是从main返回并由于调用exit而被调用的结果。”

所以,我可以提出一个建议,当析构函数被调用时,没有任何有效的ostream对象(在这种情况下就像cout)。