我正在开发一个性能关键的动态链接库 (DLL),它也应该具有相对较小的二进制大小。由于它没有明确抛出任何异常,我想完全禁用异常支持。但是,有一个例外(双关语意外):当内存不足 (OOM) 时,我必须向应用程序报告错误代码,以便它有机会优雅地处理事情。代码库太大,无法单独检查每个分配并传播错误,并且包含我不应该接触的外部代码。所以我想在我的 DLL 导出函数中捕获 OOM 异常。
一个快速测试表明,当在 Visual C++ 2010 中禁用 C++ 异常(即没有 /EHa、/EHsc 或 /EHs 标志)时,它仍然会在分配过多内存时跳转到 catch(std::bad_alloc&) 块。
所以它似乎按预期工作。但是,我收到以下 1 级警告:“C4530:使用了 C++ 异常处理程序,但未启用展开语义。指定 /EHsc”。MSDN 说“在框架中自动存储的对象,在执行投掷的函数和捕获投掷的函数之间,不会被破坏”。
我会在这里失去什么?只要可以删除通过库创建的任何内容,并且应用程序可以重新开始(如果它愿意),就可以将事物置于未定义状态。是否存在无法恢复的泄漏内存的大风险?
DLL 是否使用单独的内存池?如果是这样,我可以在不需要应用程序卸载 DLL 的情况下清除它吗?我可以轻松地让我的库忽略任何进一步的(导出的)函数调用,直到应用程序执行重新初始化。
谢谢你的建议。