在构造函数中出现异常之前,内存未被释放

时间:2014-07-14 04:40:47

标签: c++ exception-handling

 class book
   {
     int*d;
     char ch;
    public:book()
       {
          try
            {
              d=new int(23);
               throw 'A';
                ch='B';
             }
          catch(char c)
             {
                 delete d;
                cout<<"caught exception in constructor\n";
             }
       }
         void show()
             {
                cout<<*d<<endl<<ch;
              }
   };
  main()
  {
      book b;
      b.show();
  }

当构造函数中出现异常时,我们应该释放分配的内存以避免内存泄漏。但是在上面的代码中,我试图释放分配的内存,即使这样它也显示正确的答案,即*的值d显示为23.为什么会这样?

1 个答案:

答案 0 :(得分:1)

在指针删除后使用指针的指示物是未定义的行为。

价值尚未清除或改变并非不自然。但是如果被清除或改变也不是不自然的。如果程序崩溃,那就不自然了。


在其他新闻中......

抛出char或其他基本值可能会造成麻烦,或至少阻止记录合适的消息。通常,期望是源自std::exception的例外,例如std::runtime_errorstd::system_error

在构造函数中捕获异常本身是可以的,但是当构造函数失败时不抛出是灾难的邀请 - 实例化代码将留下无效的对象。

为了便于在失败的构造函数中进行清理,请使用智能指针,标准集合类或自定义RAII(在适当定义的类型的析构函数中进行清理)。

在没有结果类型的情况下声明main在C ++中无效,C ++从未支持隐式int

关于样式,public:book()看起来像应用于单个项目的访问说明符,如Java和C#。在C ++中,访问说明符启动具有给定访问权限的区域。因此,将它在视觉上与单一的东西结合起来是不自然的。