小编Nic*_*ens的帖子

如何在禁用C++异常(VS2010)的情况下确保内存不足的可靠性?

我正在研究一个性能关键的动态链接库(DLL),它也应该具有相对较小的二进制大小.由于它没有显式抛出任何异常,我想完全禁用异常支持.但是,有一个例外(双关语无意):当内存不足(OOM)时,我必须向应用程序报告错误代码,以便它有机会正常处理事情.代码库太大,无法单独检查每个分配并传播错误,并包含我不应该触及的外部代码.所以我想在DLL的导出函数中捕获OOM异常.

快速测试表明,在Visual C++ 2010中禁用C++异常时(即没有/ EHa,/ EHsc或/ EHs标志),在分配太多内存时,它仍会跳转到catch(std :: bad_alloc&)块.

所以它似乎按预期工作.但是,我收到以下1级警告:"C4530:使用了C++异常处理程序,但未启用展开语义.指定/ EHsc".MSDN说"在帧中自动存储的对象,在执行throw的函数和捕获throw的函数之间,不会被破坏".

究竟我会在这里失去什么?只要通过库创建的任何内容都可以删除,并且应用程序可以重新开始(如果它选择的话),可以将事物保留在未定义状态.是否存在无法恢复的内存泄漏风险?

DLL是否使用单独的内存池?如果是这样,我可以清除它而不需要应用程序卸载DLL吗?我可以轻松地让我的库忽略任何进一步(导出)函数调用,直到应用程序执行重新初始化.

谢谢你的建议.

c++ dll exception out-of-memory robustness

10
推荐指数
1
解决办法
860
查看次数

有没有办法让急切地调用C++析构函数?

我的C++代码中的一些函数具有使用大量堆内存的临时本地对象.因此,我希望它们在被我们完成后立即被破坏并释放他们的记忆.但是当变量名超出范围时,C++只调用析构函数.有没有办法让编译器在变量的活跃范围的末尾自动调用析构函数或另一个清理方法?

当然我可以手动新建/删除对象,但这很不方便且容易出错.同样不令人满意的是使用额外的大括号来明确限制范围.

编辑:从响应来判断,目前的C++功能似乎无法做到这一点.我会建议它用于下一个标准.

c++ optimization destructor scope

0
推荐指数
1
解决办法
168
查看次数