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

2024-03-07

我定义了一个类 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个对象抛出Out-of-memory异常。但事实证明,只有 5 个析构函数调用,并且 p 指向的位置存储的 3 个对象的数组没有调用析构函数。所以我想知道为什么?为什么程序只调用这 5 个对象的析构函数?


“原子”C++ 分配和构造函数are正确且异常安全:如果new T;抛出,没有泄漏,如果new T[N]沿途扔到任何地方,所有已经构建的东西都会被摧毁。所以没什么好担心的。

现在题外话:

你什么always必须担心正在使用超过一个 new以任何单一责任单位表达。基本上,你必须考虑任何new表达为一个烫手山芋,需要被一个完整构建的、负责任的守护对象吸收。

考虑new and new[]严格作为库构建块:您永远不会在高级用户代码中使用它们(也许除了单个new在构造函数中),并且仅在库类中。

To wit:

// BAD:
A * p = new A;
B * q = new B;  // Ouch -- *p may leak if this throws!

// Good:
std::unique_ptr<A> p(new A);
std::unique_ptr<B> q(new B); // who cares if this throws
std::unique_ptr<C[3]> r(new C[3]); // ditto

As another aside: The standard library containers implement a similar behaviour: If you say resize(N) (growing), and an exception occurs during any of the constructions, then all of the already-constructed elements are destroyed. That is, resize(N) either grows the container to the specified size or not at all. (E.g. in GCC 4.6, see the implementation of _M_fill_insert() in bits/vector.tcc for a library version of exception-checked range construction.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何使用 WSO2 API Manager 将租户设置为调解器中的标头

    我有一个 API 需要租户作为标头 如果我创建一个自定义顺序
  • laravel查询,多余的行将被插入到表格发票详细信息中。例如FROM表包含6行,执行TO表后将有21行

    ar po id variableAry explode ar foreach variableAry as var1 details11 DB table po estimations gt where po number var1 gt
  • 嵌套角度材质选项卡

    我需要向某些添加动态选项卡User Preferences屏幕 主首选项选项卡可以是具有静态内容的静态选项卡 但第二个选项卡应该嵌套mat tab元素 这些额外的动态首选项来自后端 然后我可以使用 ngFor渲染额外的选项卡 我现在看到的问
  • 处理 CloudKit 错误

    我正在寻找有关在 Swift 中处理 CloudKit 错误的一般建议 但在网上找不到好的示例 这是我想知道的事情 1 每次出现错误的可能性时 我是否应该考虑每种错误类型 或者这实际上没有必要 2 我读到 处理 CloudKit 错误的一种
  • Puppeteer:屏幕截图惰性图像不起作用[重复]

    这个问题在这里已经有答案了 我似乎无法捕获屏幕截图https today line me HK pc https today line me HK pc成功地 在我的 Puppeteer 脚本中 我还启动了滚动到页面底部并再次向上滚动以确保
  • Pandas Dataframe - 值是列表

    我有一个只有一列的 Pandas Dataframe 但每一行的值都是五个元素的列表 如下所示 Column timestamp 06 54 00 1 2 3 4 5 06 55 00 0 5 2 3 4 5 1 3 我想分离数据 以便获得
  • 为什么向量中的分配器是 const ?

    向量在每种类型的构造函数中都有这个 const allocator type alloc allocator type 为什么它是常量 我不明白这有什么用处 我可以看到传入一个分配器 因此多个向量可以共享同一个池 但可以与另一组向量分开 但
  • 像 Matlab 一样的 gnuplot ytics 表示法

    我想设置 ytics 符号 就像这个 Matlab 图 图形框上只有一个 x10 5 一样 是否可以 你当然可以这样做by hand在 gnuplot 中 使用enhanced许多终端的选项并设置label set terminal png
  • 无法理解 a = b = 0 的目的;

    我目前正在阅读 Java 初学者指南 书中的某些地方有一段代码让我感到困惑 但我找不到它的作用的解释 int a int b a b 0 This is the line I don t understand 我所理解的是 0 的值被复制到
  • 如何使数据库大小超过 256 字节 [链接器文件 - MPLAB ]

    我有 PIC18F87J11 系列 并且正在使用 MPLAB C18 编译器 我可以给以下变量的最大字节是多少 我知道我必须修改链接器文件才能达到 256 字节以上 pragma udata CONNECTION TABLE 这是我干净的链
  • Scala 中的执行上下文是什么?

    我是 Scala 新手 正在尝试使用一些并行结构 Future尤其 我发现有一个类型的隐式参数ExecutionContext IMO 它类似于 并且可能比 线程池的概念 我试图通过学习它文档 http docs scala lang or
  • Microsoft UI 自动化教程/参考 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近使用 Microsoft Accessibility API 实现了一个程序 但后来被告知新的
  • 使用双重哈希时,最佳的第二哈希函数是什么?

    我在一些人们使用的论坛上看到 7 key mod 7 or 6 key mod 6 这用于为任何大的键值计算双哈希的第二个哈希函数 使用 6 甚至不是素数 或 7 有什么重要性吗 或者它只是随机生成一些值 与线性探测和二次探测不同 参考 h
  • nbconvert 多索引数据帧到乳胶

    我正在尝试使用 ipython 的 nbconvert 将多索引 Pandas DataFrame 导出到乳胶 但多索引行结果都是错误的 我在代码开头使用以下代码来正确转换为乳胶 我在 SO 上的某个地方找到了它 但不记得在哪里 from
  • ViewPager内的ScrollView,自动滚动到中间

    我有一个 ViewPager 其中包含同一片段的多个实例 该片段包含一篇文章 文章视图层次结构非常简单 一个标题 一个横幅图像 一个副标题和一个正文 除了标题之外的所有内容都包含在滚动视图中 问题是 当您滑动到新页面时 片段会在顶部显示视图
  • 如何在每次测试后重置 Django 测试数据库 ID?

    我有一个 django 应用程序 我正在其上运行一些单元测试 所以我遇到的问题不是当一个测试插入测试数据库时 这是随后的测试 由于每个测试都不保存交易 因此先前测试的条目不存在这很好 尽管自动增量 id 正在增加 就好像数据库中仍然有条目一
  • 如何在 Svelte/Sapper 应用程序中包含 JQuery?

    有许多组件仍然需要我需要使用的 JQuery 不幸的是 在 Svelte Sapper 中执行此操作的最佳方法是什么 我应该使用 ES6 导入 修改汇总 还是最好的方法是什么 例如 我需要包含来自 DevExpress 或 Kendo UI
  • 在 grails 插件安装期间无法解决依赖关系

    我从 PC 中删除了 grails 文件夹 当我在 Intellij IDE 中打开应用程序时 buildConfig groovy 中提到的插件开始安装 安装了一些插件 但有六个插件无法安装 发生以下错误 C Program Files
  • 使用首选项在运行时更改语言 [android]

    我读了几遍官方指南 http developer android com guide topics ui settings html对于这个 以及许多其他的东西 比如这个网站上的问题 但我不能让我的工作 100 截至目前 如果我更改列表首选
  • 有人可以准确解释如果在堆上分配对象数组的过程中抛出异常会发生什么吗?

    我定义了一个类 foo 如下 class foo private static int objcnt public foo if objcnt 8 throw outOfMemory No more space else objcnt cl