问题标签 [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 投票
3 回答
103 浏览

c++ - 与构造函数参数相关的异常安全的成语

我一直在查看我正在处理的一些代码,我们有这样的等价物:

其中 AutoPtr 是我们的 auto_ptr 版本,而 Detach() 返回拥有的指针并重置自身。此外,B() 拥有 x 的所有权。

现在,我意识到如果 new 抛出 std::bad_alloc 会泄漏 x,所以我将代码更改为:

但后来我意识到,如果 B() '拥有'指针,并且在其构造过程中发生异常,它应该负责删除参数本身(或者应该删除?),所以 x 将被删除两次,一次被 B (),并且一次由 x 的析构函数。

现在,是否有解决此问题的 C++ 习惯用法,例如,编写调用负责清理参数的构造函数的代码?我见过的大多数代码似乎都没有这样做......

0 投票
1 回答
6019 浏览

c++ - 将 emplace_back 与 unique_ptrs 容器一起使用是否安全?

考虑以下:

如果向量中发生重新分配,并且失败(抛出std::bad_alloc),我是“安全”还是会泄漏int

C++11 23.3.6.5 [vector.modifiers]/1 说:

如果除复制构造函数、移动构造函数、赋值运算符或移动赋值运算符之外的T任何InputIterator操作引发异常,则没有任何影响。

这似乎表明这是一个潜在的问题。也就是说,如果“没有效果”,那么就不会构造任何东西,因此不会发生unique_ptr依赖于该指针的析构函数行为。delete(这可能表明emplace_back应该禁止unique_ptrs 的容器)

0 投票
1 回答
1328 浏览

c++ - C++ 隐式生成的赋值运算符的异常安全性

我的理解是 C++隐式生成的赋值运算符会按成员进行复制(这似乎也被这个答案证实了)。但是,如果在成员复制期间抛出异常(例如,因为无法分配该成员的资源),被复制的对象是否会陷入无效状态?

换句话说,隐式生成的赋值运算符是否只实现了基本保证,而不是强保证?

如果我们想为我们的类副本提供强有力的保证,我们是否必须使用复制和交换习语手动实现赋值运算符?

0 投票
3 回答
202 浏览

c++ - 实现如何保证迭代器的复制构造函数不会抛出?

C++11 标准的第 23.2.1.10 条说

“返回的迭代器的复制 ctor 不会引发异常”

这是否基本上说明了迭代器的复制 ctor 可能不会抛出一个 bad_alloc(假设迭代器可能只是一个指针,这里没有问题),因为它将使用“返回的”中已经构建的信息迭代器”?因为它是按值传递的,所以堆栈会在被调用函数中分配,因此可以保证没有内存问题吗?

0 投票
1 回答
388 浏览

c++ - std::tie 的异常安全性如何?

std::tie返回一个引用元组,因此您可以执行以下操作:

这与foo, bar, baz = (1, 2, 3)Python 中的类似。

如果其中一项任务抛出,应该发生什么,如下例所示?

它会打印 1337 或 42,还是未指定?

0 投票
0 回答
1669 浏览

c# - 使用 C# 在 ROT 中创建对 COM 对象的强引用

我需要绑定到一个正在运行的 COM 实例(可能有很多我正在寻找的实例,所以我需要通过检查运行对象表来确定哪一个是正确的)使用 CoClassCreate 或new带有类的运算符是我没有选择。

我的代码几乎可以工作,只是它不是异常安全的。

如果像下面的代码中那样抛出异常,有没有办法避免在Revoke幕后发生的自动?一旦应用程序结束,COM 对象就会从 ROT 中删除,而注册它的应用程序仍在运行。我很确定 Release() 会被自动调用,因为它是最后一个引用 COM 的对象,所以 ROT 条目消失了。

我想以原子和异常安全的方式获得对 ROT 中对象的强引用。

我尝试将绰号与该方法结合使用的所有尝试BindToObject均未成功。.NET 4.0 中的实现有问题吗?第一次调用似乎有效,但后续调用都因 Argument 或 invalidCast 异常而失败,即使在使用 IUnknown 的 Guid 时也是如此。据我所知,这应该总是成功还是我忽略了什么?

这是迄今为止我能产生的最好的工作代码。我只是想念异常安全。该程序旨在自行运行并且是可中断的(可以随时抛出异常以中断胎面)。如果我不能彻底解决,留下这件未完成的事情肯定会给我带来一些麻烦。

附加说明:这可能发生在 OutProc 服务器仅将活动对象注册为弱引用时。我对此没有影响,我不是服务器端的作者......我需要绑定到正在运行的对象,而不会有对象可以从运行对象表中撤销的风险。

0 投票
1 回答
201 浏览

c++ - Lua、线程和 C++ 异常

我正计划向我的开发团队建议我们开始为我们目前正在进行的项目寻找 lua 而不是 C++。关于这个问题,我有一个问题需要先弄清楚。

使用当前的 SDK,我们不允许使用 C++ 异常,因为它在多线程应用程序(使用该 SDK 创建)中不安全。实际上,这是允许的,只是不鼓励......但是除非我们通过 -fno-exceptions,否则程序将无法编译,所以......是的......

反正。由于 Lua 在它自己的 VM 中运行并且是纯 C 语言...... Lua 中的异常会“安全”吗?

0 投票
2 回答
388 浏览

c++ - 是什么阻止了编译器对强异常安全代码重新排序的优化?

鉴于 Jon Kalb 的强异常安全代码来解决 Cargill Widget 示例,是什么阻止了编译器重新组织操作,从而使代码不是强异常安全的?

是“编译器不能改变可观察行为”规则吗?

参考:

0 投票
2 回答
1333 浏览

c++ - 无抛出异常保证和堆栈溢出

有几个特殊功能通常可以保证不抛出异常,例如:

  • 析构函数
  • swap方法

考虑以下swap实现,如本答案所述:

它使用两个swap函数——整数和指针。如果第二个函数会导致堆栈溢出怎么办?对象将损坏。我猜这不是std::exception,它是某种系统异常,例如Win32-exception. 但是现在我们不能保证不抛出,因为我们正在调用一个函数。

但是所有权威来源都可以正常使用swap,这里永远不会抛出异常。为什么?

0 投票
2 回答
13459 浏览

c++ - 在 C++11 的析构函数中锁定互斥锁

我有一些代码需要线程安全和异常安全。下面的代码是我的问题的一个非常简化的版本:

我有一个互斥体,需要锁定对象的析构函数。问题是我的析构函数不应该抛出异常。

我能做些什么 ?

0)我不能n用原子变量替换(当然在这里可以解决问题,但这不是我的问题的重点)

1)我可以用自旋锁替换我的互斥锁

2)我可以尝试将锁定捕获到一个无限循环中,直到我最终获得锁定而没有引发异常

这些解决方案似乎都不是很吸引人。你有同样的问题吗?你是怎么解决的?