微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 如果在堆上分配对象数组的过程中抛出异常,有人可以准确解释会发生什么吗?

我定义了一个类foo如下:

class foo {
private:
   static int objcnt;
public:
   foo() {
       if(objcnt==8)
           throw outOfMemory("No more space!");
       else
          objcnt++;
   }

   class outOfMemory {
   public:
       outOfMemory(char* msg) { cout << msg << endl;}
   };

   ~foo() { cout << "Deleting foo." << endl; objcnt--;}
};
int foo::objcnt = 0;

这是主要功能

int main() {
    try {
            foo* p = new foo[3];
            cout << "p in try " << p << endl;
            foo* q = new foo[7];
        }catch(foo::outOfMemory& o) {
           cout << "Out-of-memory Exception Caught." << endl;
        }
}

很明显,行“foo * q = new foo [7];”仅成功创建5个对象,并在第6个对象上抛出内存不足异常.但事实证明,只有5个析构函数调用,并且没有为存储在p指向的位置存储的3个对象的数组调用destrcutor.所以我想知道为什么?为什么程序只调用这5个对象的析构函数

解决方法

只对完全构造的对象调用析构函数 – 这些对象的构造函数正常完成.只有在new []正在进行时抛出异常时才会自动发生.所以在你的例子中,析构函数将在q = new foo [7]运行期间为完全构造的五个对象运行.

由于p指向成功完成的数组的new []现在处理了该数组,并且C运行时不再关心它 – 除非你删除[] p,否则不会运行析构函数.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐