根据此 Microsoft 参考,调用 exit() 时哪些变量会被销毁?

问题描述 投票:0回答:1

我试图找出

terminate
exit
abort
之间的区别以及 我的 Google 搜索中出现了 C++ 终止 文档,该文档比较了
exit
abort
atexit

我读了比较

exit
abort
的第一部分,它很有意义。

exit 和 abort 的区别在于 exit 允许 C++ 要进行的运行时终止处理(全局对象 析构函数被调用)。 abort 立即终止程序。这 abort 函数绕过初始化的正常销毁过程 全局静态对象。它还绕过任何特殊处理 是使用 atexit 函数指定的。

然后还有

return
exit
与这个示例代码的对比以及相应的解释:

// return_statement.cpp
#include <stdlib.h>
struct S 
{
    int value;
};
int main()
{
    S s{ 3 };

    exit( 3 );
    // or
    return 3;
}

上例中的 exit 和 return 语句具有类似的作用 行为。两者都终止程序并将值 3 返回给 操作系统。不同之处在于 exit 不会破坏 自动变量

s
,而 return 语句则如此。

  1. 我是否误解了或者有错误,因为我认为当

    s
    被调用时
    exit
    也会被销毁?

  2. 如果

    s
    没有被销毁,我们如何从堆栈中回收这块内存?如果
    s
    在堆上,我们也会泄漏这段内存吗?

我并不是在寻找特定于 Microsoft 的解决方案。我刚刚找到源代码并意识到 Microsoft 确实为像我这样的初学者提供了很好的文档。

c++ return destructor exit
1个回答
0
投票

全局对象被销毁;本地对象不是。例如这段代码:

#include <stdio.h>
#include <stdlib.h>

class Foo {
    char const *s;
public:
    Foo(char const *s) : s(s) {}
    ~Foo() { fprintf(stderr, "cleaning up %s object\n", s); }
};

Foo f("global");

int main() {
    Foo g("local");
    exit(0);
}

产生此输出:

cleaning up global object

Godbolt 直播

© www.soinside.com 2019 - 2024. All rights reserved.