c++ - 异常指针清理

标签 c++ exception legacy

我们都知道抛出异常指针是不好的:

try
{
    ...
    throw new MyExceptionClass();
}
catch (MyExceptionClass* e)
{
    ...
}

您在遗留代码中清理捕获目标的方法是什么?我认为我可以通过将 operator new 设为私有(private)来修复第一部分:

class MyExceptionClass
{
public:
    ...
private:
    void* operator new(size_t);
}

如何在编译时使捕获部分变得同样丑陋?我不想让它陷入 catch (...) 领域。

最佳答案

除了静态分析工具或代码审查之外,您无法采取任何措施来防止指针捕获。但是,如果您几乎不可能抛出 MyExceptionClass 指针,则 catch(MyExceptionClass*) block 将成为死代码。

为了更彻底地防止指针抛出异常,您实际上需要做更多的工作。

隐藏所有形式的运算符 new -- 请参阅here

隐藏地址运算符 -- 抛出先前分配的对象的地址会带来一些与抛出堆分配的对象相同的问题。

class MyExceptionClass
{
private:
    MyExceptionClass* operator&();
}

关于c++ - 异常指针清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/971668/

相关文章:

c++ - GCC 中的结构对齐(是否应在 typedef 中指定对齐?)

java - 构造函数可以抛出运行时异常吗?

c++ - 在 noexcept 函数体中处理 std::optional 是否安全?

c# - 在 C# 中何时重新抛出异常?

database - 使用遗留数据库测试 Django 应用程序 - 如何避免每次测试重新创建数据库?

git - 适用于具有潜在外部非 git 用户的旧项目的工作流程 Git FTP

c++ - 我的链表节点删除功能导致程序的其他部分崩溃

c++ - 在 Windows 上为可移植程序使用 Opencv、Mingw 和静态库时出错

c++ - constexpr "[v[n]]sprintf"可能吗?

c# - 在没有 .Net 的情况下运行 C# 程序 - 不会重新发布