问题标签 [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.
c++ - 如何设计具有强异常保证的函数?
我有一个功能,我希望有强大的异常保证:
我能想到使其具有强大的异常保证的唯一方法如下:
但是,这真的很丑陋且容易出错!有没有比我上面提到的更好的解决方案?我可以听到有人告诉我我需要使用 RAII,但我无法弄清楚如何使用,因为pop_back
在函数正常返回时不能进行操作。
我也希望任何解决方案都是零 - 快乐道路上的开销;我真的需要尽可能快的快乐之路。
c++ - std::function 的目标对象在哪里被禁止抛出破坏?
考虑std::function
定义:
析构函数没有明确标记noexcept
。此声明被解释为它不在noexcept
C++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 -Callable和Cpp17CopyConstructible。
但是,我看不到目标对象析构函数不抛出的指定位置。
是否在任何地方指定?
还是析构函数function
不意味着noexcept?
c++ - std::tuple 不是异常安全的,常规结构也不是
我正在乱扔移动构造函数和赋值运算符。
一个众所周知的问题std::vector
是向量元素必须在重新分配时被复制,并且如果所述元素的移动构造函数不是,则不能移动noexcept
。这是为了保持向量的强异常安全保证(如果移动一个元素抛出并且我们正在移动整个向量的中间,我们会留下一半的移动元素向量,所以最好复制所以我们如果操作失败,至少可以回滚)。
但是,我不知道的是,它也std::tuple
遇到了这个问题。给定 a std::tuple<A, B, A>
,其中 B 的移动赋值运算符抛出,移动所述元组导致只有第一个A
对象被移动到新元组中,而后两个保留在旧元组中。我们基本上将对象分成两半。我刚刚测试了这个确切的场景,果然,元组现在处于不一致的状态。
struct
然后我用同样的三个成员尝试了同样的事情, A
,B
然后A
再一次。我惊恐地发现它有完全相同的问题。默认的移动赋值运算符不考虑异常安全。
这实际上是预期的行为吗?不std::tuple
提供强大的异常安全保障?默认移动赋值运算符是否不提供上述保证?
这似乎是一个巨大的问题。对于成员移动可能抛出的情况,我们是否必须显式提供移动构造函数和移动赋值运算符?这本质上意味着始终在通用/模板上下文中提供它。这是很多工作。我们对于它可以做些什么呢?
c++ - 复制 C++ 容器时,我们有哪些异常安全保证?
当新容器的任何分配或元素的复制因异常而失败时,目标容器的当前内容是否会保持不变?
haskell - 在流管道中将 ResourceT 与括号结合起来
这是我的代码的简化:
在以下行中存在类型错误go stream
:
错误说:
问题
- 怎样做才能使这个代码类型检查并且仍然保证在
calculateA
函数中释放资源是安全的? - 我正在使用读取多个文件
C.readFile
,然后将其包装在runResourceT
. 这会正确释放所有文件句柄吗? - 配乐好不好?(请注意,我需要与
calculateA
分开的功能myLinesStream
)