问题标签 [scopeguard]

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 投票
8 回答
12067 浏览

c++ - ScopeGuard 的使用真的会带来更好的代码吗?

我看到了 Andrei Alexandrescu 和 Petru Marginean 多年前写的这篇文章,其中介绍并讨论了一个名为 ScopeGuard 的实用程序类,用于编写异常安全的代码。我想知道使用这些对象进行编码是否真的会导致更好的代码,或者它是否会混淆错误处理,因为也许守卫的回调会更好地呈现在 catch 块中?有没有人有在实际生产代码中使用这些的经验?

0 投票
2 回答
2745 浏览

c++ - 动态创建的范围保护

我在 DDJ中阅读了关于范围保护的文章(通用:改变你编写异常安全代码的方式——永远),我了解它们的常见用途。

但是,常见的用途是在堆栈上为特定操作实例化特定的堆栈保护,例如:

但是如果我想在运行时安排清理操作怎么办,例如当我有一个循环时:

显然,上面的例子是行不通的,因为它会与for范围topSecret一起被关闭。我想要一个范围保护模式,我可以在其中轻松地将我确定在运行时需要的清理操作排队。有这样的东西吗?

我无法将范围保护对象推送到标准队列中,因为原始对象(我正在推送的对象)将在此过程中被解雇。推送堆分配的堆栈保护并使用删除其成员在 dtor 上的队列怎么样?有没有人有更聪明的方法?

0 投票
1 回答
895 浏览

c++ - 用于临时延长寿命的 const 参考

我对某些 C++ 标准合规性或缺乏它有疑问。

在我的项目中,我使用了一些使用 const 引用技巧的简单 Guard 类。我正在使用 Visual Studio 2005,有两种配置 - 一种用于正常发布版本,另一种用于单元测试。

在这两种情况下,最后都会在 const 引用上临时挂起,但同时发生的事情就是问题所在。对于发布配置, const 引用直接指向在创建 Guard 实例的辅助函数模板的返回中创建的 temp(没有调用复制构造函数,甚至没有实例化)。

但是对于单元测试 conf,首先复制函数模板 temp,然后调用它的析构函数,只有在 const 引用超出范围后才应该做的事情。

我已经通过禁用基类复制构造函数中的原始保护解决了这个问题(所以析构函数中的操作不会为调用复制构造函数的配置触发),但困扰我的是:

复制临时行为是否符合标准?标准是否告诉 const 引用应该直接指向 temp,或者标准中没有指定这种实现定义的行为?

我的代码大致基于 DDJ 中的 Scope Guard 文章和 Herb Sutter 的 gotw 88 文章,但是这两个来源似乎都没有考虑到早期的析构函数调用。

来自知识渊博的人的任何信息将不胜感激。

编辑:

好的,代码是这样的:

0 投票
2 回答
443 浏览

c++ - ScopeGuard 解雇

我的代码需要范围保护,但是我是否必须Dismiss()在正常退出函数时手动所有范围保护?IE

0 投票
3 回答
320 浏览

c++ - Scopeguard 和参数引用

这篇文章中的参考支持参数部分,他们指出了参考的问题并提供了解决方案。我的问题是:他们为什么不首先将参数声明为引用?即,而不是:

做:

0 投票
14 回答
40001 浏览

c++ - 最简单最整洁的c++11 ScopeGuard

我正在尝试编写一个基于 Alexandrescu 概念但使用 c++11 习语的简单 ScopeGuard。

这是用法:

由于我的版本比那里的大多数示例(如 Boost ScopeExit)短得多,我想知道我遗漏了哪些专业。希望我在这里处于 80/20 的场景中(我得到了 80% 的整洁度和 20% 的代码行),但我不禁想知道我是否遗漏了一些重要的东西,或者是否有一些缺点值得提到这个版本的 ScopeGuard 成语

谢谢!

编辑我注意到 makeScopeGuard 的一个非常重要的问题,它在构造函数中采用了 adquire lambda。如果 adquire lambda 抛出,则永远不会调用 release lambda,因为范围保护从未完全构造。在许多情况下,这是所需的行为,但我觉得有时也需要一个在抛出发生时调用回滚的版本:


所以为了完整起见,我想把完整的代码放在这里,包括测试:


0 投票
1 回答
1495 浏览

c# - C# 中的范围保护语句

Resource Acquisition Is Initialization (RAII) 习语和 try-finally 语句构成了编写异常安全编程的传统方法的支柱。

我的问题是:C# 上是否有类似Scope Guard Statement的东西?

0 投票
2 回答
1494 浏览

c++ - 用于函数对和模板专业化的 RAII 包装器

我为初始化和释放资源的 C 函数对编写了一个 RAII 包装器,它在大多数情况下都能很好地为我服务。

但是,比如说当一个函数返回时,voidEnter/LeaveCriticalSection不确定如何在这个类中进行操作。我应该专门针对SuccessValueType = void案例的课程吗?或者具有默认模板参数的东西应该做什么?

0 投票
1 回答
2059 浏览

c++ - 为什么 Alexandrescu 不能使用 std::uncaught_exception() 在 ScopeGuard11 中实现 SCOPE_FAIL?

毫无疑问,很多人都熟悉 Alexandrescus 先生的 ScopeGuard 模板(现在是 Loki 的一部分)以及此处介绍的新版本 ScopeGuard11:http: //channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012- Andrei-Alexandrescu-Systematic-Error-Handling-in-C

来源: https ://gist.github.com/KindDragon/4650442

在他在 c++ 和 2012 年以后的演讲中,他提到他找不到正确检测范围是否因异常而退出的方法。因此,当且仅当范围因异常而退出时,他无法实现 SCOPE_FAIL 宏,该宏将执行提供的 lambda(通常用于回滚代码)。这将使dismiss() 成员函数变得不需要,并使代码更具可读性。

由于我绝不像 Alexandrescu 先生那样天才或经验丰富,我希望实现 SCOPE_FAIL 并不像这样容易:

我的问题是为什么不呢?

0 投票
2 回答
375 浏览

c++ - 谁复制函数的返回值?

是调用者还是被调用者复制或移动函数的返回值?比如我想实现一个队列的pop()函数,像这样

我的作用域守卫的析构函数是在复制前面元素后调用的吗?

编辑:后续问题:行吗

现在是异常安全的吗?