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,否则不会运行析构函数.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...