类构造函数中异常处理的行为

2024-01-10

我有这个程序,其中派生类的构造函数抛出异常。该程序只是一个示例程序,我只是想了解异常处理的概念。

class A{
public:
   A() {}

   ~A(){std::cout << "DTOR called - A!!" << std::endl;}
};

class B : public A
{
public:
   B():A()
   {
      try
      {
         init();
      }
      catch(...)
      {
         std::cout << "Inside catch block in B's Ctor!!" << std::endl;
         throw this;
      }
   }

   void init() { throw 0;  }

   ~B() {std::cout << "DTOR called - B!!" << std::endl; }
};

int main()
{
   try{
      B *b = new B;

      std::cout << "Äfter B's ctor called in try block!!" << std::endl;
      delete b;
      std::cout << "Äfter B's dtor called in try block!!" << std::endl;
   }

   catch(B* b)
   {
      delete b;
      b = NULL;
      std::cout << "Exception Occurred in B!!" << std::endl;
   }

   catch(A* a)
   {
      delete a;
      a = NULL;
      std::cout << "Exception Occurred in A!!" << std::endl;
   }

   catch(...)
   {
      std::cout << "Exception Occured!!" << std::endl;
   }
   return EXIT_SUCCESS;
}

预期的输出是它应该进入 B 的 catch 块,并且首先调用 B 的 dtor,然后调用 A 的 dtor。但上面程序的输出是:

Inside catch block in B's Ctor!!
DTOR called - A!!
DTOR called - B!!
DTOR called - A!!
Exception Occurred in B!!

我的问题是,为什么 A 类的 dtor 只进入 B 类的 catch 块并仅调用 B 类的 dtor 时,会调用两次? 另外,请告诉我我在这里是否犯了一些错误。 任何帮助表示赞赏

Edit:

class B : public A
{
public:
   B():A()
   {
      try
      {
         szName = new char[100];
         init();
      }
      catch(...)
      {
         std::cout << "Inside catch block in B's Ctor!!" << std::endl;
         throw this;
      }
   }

   void init() { throw 0;  }

   ~B()
   {
      delete szName;
      std::cout << "DTOR called - B!!" << std::endl;
   }

   char *szName;
};

这里我在类 B 中创建了一个 char 指针。在抛出异常之前,在 Ctor 的 try 块中分配了内存。现在在这种情况下,如果我没有捕获 B 类的异常,是否会出现内存泄漏?


你为什么要把“this”扔到你的catch块中?你在尝试做“这个”时已经打嗝了,那你怎么能扔掉它呢?尝试扔掉你抓住的东西,或者其他东西,比如“哎呀”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类构造函数中异常处理的行为 的相关文章

随机推荐

  • jQuery Cycle 插件 - 暂停/恢复奇怪的行为

    我有一个使用很棒的循环插件运行的幻灯片 当您单击演示中的按钮时 我会在页面上显示一个隐藏层并发送 暂停 命令来循环 我有两个问题 当收到暂停命令时 循环立即翻转回序列中的第一张幻灯片 为什么 并且不会触发我的之前 之后回调 关闭图层后 我发
  • 正则表达式用于 [] 之间的任何内容

    我需要找到 的正则表达式 例如 如果字符串是 Hi Stack 这是我需要 Find 的 Tag 它应该返回 堆栈 标记 查找 非常简单 您只需要 1 用反斜杠转义括号 2 使用 捕获内容 括号是一个捕获组 它们捕获其内容以供以后使用 后面
  • 如何通过复制上一行来动态创建新行

    我有一个如下所示的数据框 编辑后的数据框 df pd DataFrame subject id 1 1 1 1 1 1 1 2 2 2 2 2 time 1 2173 04 03 12 35 00 2173 04 03 12 50 00 2
  • Android Intent.ACTION_VIEW

    我需要用户选择自己的播放器来播放视频 我尝试 public class VideoViewActivity extends Activity Override public void onCreate Bundle savedInstanc
  • 比较名称之间的相似度

    我必须根据名称对一些数据进行交叉验证 我面临的问题是 根据来源 名称略有不同 例如 L L AIR CONDITIONING vs L L AIR CONDITIONING Service BEST ROOFING vs ROOFING I
  • 处理异常的示例代码

    我是 Android 移动应用程序开发新手 我想知道如何处理异常HttpConnection相关异常或任何其他异常 我需要显示一个AlertDialog给用户 请提供示例代码或项目源代码以了解我如何处理HttpConnection或类似类型
  • 在 iPhone 应用程序中显示 HTML

    如何在 iPhone 的 textview 中打开 url 是否可以显示数据links photos和所有html entities 您可以使用 UIWebView 从文件加载静态包含 html 照片 css javascript NSSt
  • 将大字符串写入文件的最佳方法

    在 C 中 我正在读取中等大小的文件 100 KB 1 MB 修改部分内容 最后写入不同的文件 所有内容均为文字 修改是作为字符串对象和字符串操作完成的 我目前的做法是 使用以下命令读取原始文件中的每一行StreamReader Open
  • Firefox 拖动 div 就像拖动图像一样

    我正在使用以下 HTML CSS 和 Javascript 代码 如果您想测试的话 可以将其放在一个文档中
  • 从数据框中删除控制字符空格

    我有一个数据框 df 通过它我可以使用它来获取列表列表 data list map str n tolist for n in df values 之后我从这样的数据中替换特定的控制字符 data e replace u xa0 u for
  • SignalR WebSockets 在本地工作但不在服务器上工作

    我正在尝试让 Web Sockets 作为使用 SignalR 2 4 2 的 ASP NET 4 8 Framework 应用程序的协议 它可以在本地主机上运行 Windows 10 Pro 的 Visual Studio 2019 上正
  • 将点投影到平面上的投影矩阵

    如何确定 4x4S矩阵 以便 P 在 XZ Y 0 平面上投影到 Q 中 Q S P 射线有坐标r t L t P L 这是组件形式 r x L x t P x L x r y L y t P y L y r z L z t P z L z
  • Get-TfsItemHistory 版本参数

    我想要一种方法来从特定日期的 TFS 中查找一组不同的更改文件 通过谷歌搜索我找到了这篇文章 http blog hackedbrain com 2009 04 01 getting a distinct list of changed f
  • 我们如何使用opencart事件?

    我搜索了很多有关 opencart 触发器的信息 但没有找到合适的示例 在 opencart 2 0 中 有一些触发器 开发人员可以挂钩函数并执行一些事情 就像我猜的 wordpress 操作和过滤器一样 例如在 catalog model
  • vuetify.js 如何获取 v-container 的全宽

    我是新来的vuetify js并开始摆弄它 这是我的代码 管理面板 vue
  • 使用回形针的文件类型的自定义缩略图

    我使用 Paperclip 和 Ruby on Rails 将资产附加到模型 这些资产可以是任何文件类型 并且当前仅当资产是图像时才会生成缩略图 我希望能够为其他文件显示不同的默认图像 可以通过在上传时生成文件的缩略图 或者使用 defau
  • 为 AppStore 构建时,Parse SDK 会导致权利资源错误

    看起来 XCode6 没有对 Parse SDK 中的资源进行签名 我使用的是最新版本 1 4 1 实际的存档 构建工作正常 事实上 我还可以通过这个过程分发 AdHoc beta 版本 而且我的测试人员可以从 HockeyApp 安装 直
  • AppEngine 数据存储区中的不平等过滤器

    据我所知 Google AppEngine 仅支持每个查询一个不等式过滤器 针对此限制有哪些解决方法 有没有任何解决方案可以提供类似的效果 实际上GAE支持多个不等式过滤器 只要它们是在同一财产上 https developers goog
  • Javascript递归超时调用

    这是我尝试编写一个动态 onmouseout 事件 当鼠标离开 div 时缓慢改变不透明度 由于某种原因 递归和超时似乎没有工作属性 并且不透明度的更改是立即完成的 问题 有没有什么原因setTimeout 不适用于递归 有没有更好的方法来
  • 类构造函数中异常处理的行为

    我有这个程序 其中派生类的构造函数抛出异常 该程序只是一个示例程序 我只是想了解异常处理的概念 class A public A A std cout lt lt DTOR called A lt lt std endl class B p