析构函数是在main()的末尾调用的;奇怪的行为

时间:2014-12-09 19:15:52

标签: c++ destructor

// Foo.h

class Foo
{

public:
    Foo();
    ~Foo();
    void exec();
};


// Foo.cpp

Foo::~Foo()
{
    // Statements A
    exit(0);
}

//main.cpp

int main()
{
    Foo foo;
    foo.exec();

    // Statements B
    return 0;
}

那么为什么A和B两个语句都被执行了?当我们到达返回0时,是否会调用析构函数?

我见过void exec();int exec();main函数以 - 结尾的变体 return foo.exec();这会调用析构函数吗?

因为我希望有一个对象从主函数中控制代码流并稍后结束程序。

2 个答案:

答案 0 :(得分:1)

析构函数,因此语句A,作为return 0语句B处理的一部分执行。这是C ++中的一个简单保证,即自动执行具有自动存储的本地对象的析构函数当执行离开对象的范围时。

答案 1 :(得分:1)

析构函数在main函数返回后调用,即在return语句之后,就像任何其他函数中的本地对象一样。

至于return someObject.someFunction();return语句中的表达式必须在return语句实际返回任何内容之前完全评估,因为它需要该表达式的结果。因此,如果函数包含一个长时间运行的循环(如GUI事件循环),那么在return语句实际返回之前可能需要相当长的时间。