问题标签 [exception-safety]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
127 浏览

c++ - 如何设计具有强异常保证的函数?

我有一个功能,我希望有强大的异常保证:

我能想到使其具有强大的异常保证的唯一方法如下:

但是,这真的很丑陋且容易出错!有没有比我上面提到的更好的解决方案?我可以听到有人告诉我我需要使用 RAII,但我无法弄清楚如何使用,因为pop_back在函数正常返回时不能进行操作。

我也希望任何解决方案都是零 - 快乐道路上的开销;我真的需要尽可能快的快乐之路。

0 投票
1 回答
65 浏览

c++ - std::function 的目标对象在哪里被禁止抛出破坏?

考虑std::function定义:

析构函数没有明确标记noexcept。此声明被解释为它不在noexceptC++14 中,而是noexcept从 C++17 开始。实现似乎加强了这一点并noexcept在 C++14 中标记(这是允许的):https ://godbolt.org/z/WPh8zs7WE

目前的草案对析构函数并没有多说,只是它破坏了目标对象。见[func.wrap.func.con]/31

~function();

效果:如果*this != nullptr,破坏这个目标。

对目标对象的一些要求列在构造函数参数[func.wrap.func.con]/8[func.wrap.func.con]/11中。具体来说,它是Lvalue -CallableCpp17CopyConstructible

但是,我看不到目标对象析构函数不抛出的指定位置。

是否在任何地方指定?

还是析构函数function不意味着noexcept?

0 投票
0 回答
44 浏览

c++ - std::tuple 不是异常安全的,常规结构也不是

我正在乱扔移动构造函数和赋值运算符。

一个众所周知的问题std::vector是向量元素必须在重新分配时被复制,并且如果所述元素的移动构造函数不是,则不能移动noexcept。这是为了保持向量的强异常安全保证(如果移动一个元素抛出并且我们正在移动整个向量的中间,我们会留下一半的移动元素向量,所以最好复制所以我们如果操作失败,至少可以回滚)。

但是,我不知道的是,它也std::tuple遇到了这个问题。给定 a std::tuple<A, B, A>,其中 B 的移动赋值运算符抛出,移动所述元组导致只有第一个A对象被移动到新元组中,而后两个保留在旧元组中。我们基本上将对象分成两半。我刚刚测试了这个确切的场景,果然,元组现在处于不一致的状态。

struct然后我用同样的三个成员尝试了同样的事情, AB然后A再一次。我惊恐地发现它有完全相同的问题。默认的移动赋值运算符不考虑异常安全。

这实际上是预期的行为吗?不std::tuple提供强大的异常安全保障?默认移动赋值运算符是否不提供上述保证?

这似乎是一个巨大的问题。对于成员移动可能抛出的情况,我们是否必须显式提供移动构造函数和移动赋值运算符?这本质上意味着始终在通用/模板上下文中提供它。这是很多工作。我们对于它可以做些什么呢?

0 投票
2 回答
156 浏览

c++ - 复制 C++ 容器时,我们有哪些异常安全保证?

当新容器的任何分配或元素的复制因异常而失败时,目标容器的当前内容是否会保持不变?

0 投票
2 回答
36 浏览

flutter - 安全性——后期初始化错误 // 颤动

由于 Flutter 中的安全性,我在代码中有一个错误,我试图通过使用LATE声明变量来解决它。<br /

但是当我尝试构建它时,它出现了另一个:

错误

这是我的代码:

0 投票
1 回答
74 浏览

haskell - 在流管道中将 ResourceT 与括号结合起来

这是我的代码的简化:

在以下行中存在类型错误go stream

错误说:

问题

  1. 怎样做才能使这个代码类型检查并且仍然保证在calculateA函数中释放资源是安全的?
  2. 我正在使用读取多个文件C.readFile,然后将其包装在runResourceT. 这会正确释放所有文件句柄吗?
  3. 配乐好不好?(请注意,我需要与calculateA分开的功能myLinesStream