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

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

概述我定义了一个类foo如下: class foo {private: static int objcnt;public: foo() { if(objcnt==8) throw outOfMemory("No more space!"); else objcnt++; } class outOfMem 我定义了一个类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 – 如果在堆上分配对象数组的过程中抛出异常,有人可以准确解释会发生什么吗?全部内容,希望文章能够帮你解决c – 如果在堆上分配对象数组的过程中抛出异常,有人可以准确解释会发生什么吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1219463.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存