调用 exit(0) 时内存泄漏

Leaking memory when calling exit(0)

我之前看过:

When you exit a C++ program by calling the exit() function, the object destructors are not run. This can result in Valgrind reporting memory leaks.

但是如果我正在等待用户输入,如果它退出然后我想退出程序,我该怎么做呢?

我正在扫描由 main 调用的另一个函数调用的函数中的输入。 像这样:

void main()
{
    func1();
}

void func1()
{
    func2();
}

void func2()
{
    std::string str;
    getline(std::cin, str);
    if (str=="exit") exit(0);
}

就这样if (str=="exit") return;

根据cppreference

Returning from the the main function, either by a return statement or by reaching the end of the function, executes exit(), passing the argument of the return statement (or ​0​ if implicit return was used) as exit_code.

换句话说,调用 exit 与从 main 返回(或从末尾掉落)相同,后者会在程序最终退出之前调用任何静态分配对象的析构函数.

也就是说,std::exit 提供了适当的保证,所以这就是要使用的保证。

Live demo


编辑: 如果你想确保在局部作用域分配的变量被销毁(见讨论)那么你可以在你想退出的地方抛出一个自定义异常编程并在 main 中捕获它,例如

class ExitProgramException {};

void foo ()
{
    ...
    if (exit_program)
    {
        ExitProgramException e;
        throw e;
    }
}

void bar ()
{
    foo ();
}

int main ()
{
    try
    {
        bar ();
    }
    catch (const ExitProgramException& e)
    {
    }
}

这应该确保堆栈正确展开。

Live demo