c – 如果在堆上分配对象数组的过程中抛出异常,有人可以准确解释
发布时间:2020-12-16 10:20:40 所属栏目:百科 来源:网络整理
导读:我定义了一个类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 "Deleti
我定义了一个类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,否则不会运行析构函数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |