【发布时间】:2011-08-03 02:33:36
【问题描述】:
我在主函数的堆栈上有一些对象:
int main(...)
{
CFoo foo;
CBar bar;
}
另外,我有一个函数可以跟踪我的应用程序中的错误:
void Err(std::string msg)
{
SomehowLogErrorMessage(msg);
exit(1);
}
当我必须报告致命错误时,Err 函数绝对有用。我只是记录错误并终止应用程序 - 在出现此类错误后它无法恢复。但是,以“exit()”终止并不会调用 foo 和 bar 析构函数——这是我实际上预期的一种行为(但这是错误的)。 “中止()”也无济于事。另外,我不能使用异常 在 main() 中捕获它们。有没有其他方法来实现 Err 函数,它会终止应用程序并正确清理堆栈对象?或者我应该以某种方式重新设计我的错误处理?
谢谢!
附言顺便说一句,我不能将 WM_QUIT 消息发送到我的主窗口吗?我不擅长使用 WinAPI,但我的应用程序是纯 Win32 并且我的 Err() 函数可以获取我的主窗口的句柄。它会起作用吗?
【问题讨论】:
-
明显愚蠢的问题,但你为什么不能使用异常?
-
如果你不能抛出异常(为什么不呢?)另一个选择是返回一个错误代码,然后将它一直传播到 main 的末尾。
-
比如说,特定于平台的限制。项目使用 -fno-exceptions 标志编译。
-
如果很重要,我想补充一点,我不关心整个调用堆栈的本地对象,我只想清理 main() 中的对象。我不确定现在是否可以......
-
"项目是使用
-fno-exceptions标志编译的" = 项目实际上并未使用 C++,这是一种需要异常支持的语言。
标签: c++ windows stack destructor exit