调用 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
提供了适当的保证,所以这就是要使用的保证。
编辑: 如果你想确保在局部作用域分配的变量被销毁(见讨论)那么你可以在你想退出的地方抛出一个自定义异常编程并在 main
中捕获它,例如
class ExitProgramException {};
void foo ()
{
...
if (exit_program)
{
ExitProgramException e;
throw e;
}
}
void bar ()
{
foo ();
}
int main ()
{
try
{
bar ();
}
catch (const ExitProgramException& e)
{
}
}
这应该确保堆栈正确展开。
我之前看过:
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
提供了适当的保证,所以这就是要使用的保证。
编辑: 如果你想确保在局部作用域分配的变量被销毁(见讨论)那么你可以在你想退出的地方抛出一个自定义异常编程并在 main
中捕获它,例如
class ExitProgramException {};
void foo ()
{
...
if (exit_program)
{
ExitProgramException e;
throw e;
}
}
void bar ()
{
foo ();
}
int main ()
{
try
{
bar ();
}
catch (const ExitProgramException& e)
{
}
}
这应该确保堆栈正确展开。