在构造函数中出现异常之前分配的内存没有被释放

memory is not getting freed up which was allocated before there arises an exception in constructor

本文关键字:内存 释放 分配 构造函数 异常      更新时间:2023-10-16
 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 constructorn";
             }
       }
         void show()
             {
                cout<<*d<<endl<<ch;
              }
   };
  main()
  {
      book b;
      b.show();
  }
当构造函数中出现异常时,我们应该释放分配的内存以避免内存泄漏。但是在上面的代码中,我试图释放分配的内存,即使这样它也显示正确的答案,即*d的值显示为23。为什么会这样呢?

在指针被删除后再使用指针是未定义行为。

该值未被清除或更改并不是不自然的。但如果被清除或改变,也不是不自然的。如果程序崩溃了,不管怎样,也不是不自然的。


在其他新闻中…

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

在构造函数中捕获异常本身是可以的,但在构造函数失败时不抛出异常则会招致灾难–实例化代码将留下一个无效的对象。

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

没有结果类型的声明main在c++中是无效的,因为c++不支持隐式int

关于样式,public:book()看起来像应用于单个项目的访问说明符,就像在Java和c#中一样。在c++中,访问说明符用给定的访问开始一个区域。因此,将它与一个单独的东西结合在一起是不自然的。