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 – 如果在堆上分配对象数组的过程中抛出异常,有人可以准确解释会发生什么吗?全部内容,希望文章能够帮你解决c – 如果在堆上分配对象数组的过程中抛出异常,有人可以准确解释会发生什么吗?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)