不抛出或异常?

2023-11-27

我是一名学生,对 C++ 的了解很少,我试图扩展它。这更多的是一个哲学问题..我并不是想实现一些东西。

Since

#include <new> 
//...
T * t = new (std::nothrow) T();
if(t)
{
    //...
}
//...

将隐藏异常,并且由于处理异常比简单的处理更重if(t),为什么不正常new T()考虑到我们必须使用,不被认为是不太好的做法try-catch()检查简单的分配是否成功(如果没有成功,就看着程序死掉)?

正常的有什么好处(如果有的话)new与使用分配相比nothrow new?在这种情况下异常的开销是微不足道的?

另外,假设分配失败(例如系统中不存在内存)。在这种情况下程序可以做些什么,或者只是优雅地失败。当所有内存都被保留时,没有办法在堆上找到空闲内存,不是吗?

如果分配失败,并且std::bad_alloc is thrown,我们如何假设由于没有足够的内存来分配对象(例如anew int),会有足够的内存来存储异常?

谢谢你的时间。我希望这个问题符合规则。


自从 处理异常比较重 与简单的 if(t) 相比,为什么不呢 正常的 new T() 不考虑 less 好的做法,考虑到我们将 必须使用 try-catch() 来检查是否 简单的分配成功了(如果我们 不,只是看着程序死掉)? 有什么好处(如果有的话) 正常的新分配与 使用 nothrow new 吗?异常的 在这种情况下,开销是微不足道的 ?

使用异常的惩罚确实非常重,但是(在适当调整的实现中)仅支付惩罚当抛出异常时- 因此主线情况保持非常快,并且在您的示例中两者之间不太可能有任何可测量的性能。

异常的优点是您的代码更简单:如果分配多个对象,您不必执行“分配 A; if (A) { 分配 B; if (B) 等...”。清理和终止 - 在异常和主线情况下 - 最好由 RAII 自动处理(而如果您手动检查,则还必须手动释放,这使得很容易泄漏内存)。

另外,假设分配失败 (例如,系统中不存在内存)。 该程序有什么可以做的吗 在这种情况下,或者只是失败 优雅地。没有办法找到 当一切就绪时,释放堆上的内存 预留了,有吗?

它可以做很多事情,最好的事情取决于正在编写的程序。失败并退出(优雅地或以其他方式)当然是一种选择。另一种是提前预留足够的内存,以便程序可以继续执行其功能(可能会减少功能或性能)。它也许能够释放一些自己的内存(例如,如果它维护可以在需要时重建的缓存)。或者(在服务器进程的情况下),服务器可能会拒绝处理当前请求(或拒绝接受新连接),但保持运行状态,以便客户端不会断开连接,并且一旦内存恢复,事情就可以重新开始工作返回。或者在交互式/GUI 应用程序的情况下,它可能会向用户显示错误并继续(允许他们修复内存问题并重试 - 或者至少保存他们的工作!)。

如果分配失败,并且 std::bad_alloc 被抛出,我们怎么办 假设由于没有足够的 分配对象的内存(例如 new int),会有足够的内存 存储异常?

不,通常标准库会通过提前分配少量内存来确保在内存耗尽时有足够的内存来引发异常。

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

不抛出或异常? 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置

随机推荐