在 C++ 中,我们可以确保在退出 scope 时调用foo ,方法是将foo()放入本地 object 的析构函数中。 当我领导“范围守卫”时,这就是我的想法。 有很多通用的实现。 我想知道——只是为了好玩——与仅在每个退出点编写foo()相比,是否有可能以零开销实现 scope 防护的行为。 零 ...
在 C++ 中,我们可以确保在退出 scope 时调用foo ,方法是将foo()放入本地 object 的析构函数中。 当我领导“范围守卫”时,这就是我的想法。 有很多通用的实现。 我想知道——只是为了好玩——与仅在每个退出点编写foo()相比,是否有可能以零开销实现 scope 防护的行为。 零 ...
在阅读有关在 C++ 中实现 Go 的 defer 的问题后: C++ 中的 golang 风格的“延迟” 我在其中一个答案中对 go-defer like guard 子句的性能有疑问。 它使用 shared_ptr 删除器忽略传递的对象地址。 如果删除器使用未命名参数忽略地址,它是否仍会 ...
使用 C++20 P0052的scope_guard (以及许多其他风格的 scope 守卫),考虑这个典型的用例: 该代码依赖于 lambda 表达式本身(闭包对象的构造)不会抛出。 C++ 标准如何保证这一点? 我阅读了标准的章节(§7.5.5 Lambda 表达式),并没有发现关于 lam ...
我写了一个作用域保护,它在作用域退出时会重置一个值: 从函数返回此范围卫士时,是否有任何方法可以防止如果未保存范围卫士,则立即销毁该范围卫士? 例如: 按照现在的编写方式,调用其中一个函数的任何人都必须记住始终将ResetGuard保存到本地变量,否则它将立即重置该值。 ...
我正在使用愚蠢的范围保护,它正在工作,但它会生成一个警告,说该变量未使用: 编码: 如何避免这种警告? ...
到目前为止,每个看过范围守卫都有一个保护布尔变量。 例如,请参阅此讨论: 最简单,最新的c ++ 11 ScopeGuard 但是一个简单的守卫工作(gcc 4.9,clang 3.6.0): 为什么没有临时副本被破坏? 依赖这种行为是危险的吗? ...
在范围出口上运行lambda似乎是一件很基本的事情,我希望它会被标准化。 当应用时,诸如unique_ptr之类的东西会更好,但是我发现需要大量的“一次性”析构函数,尤其是在利用C样式库时。 有谁知道这是否要来吗? ...
我在一个函数中分配了多个资源,因此有很多指针,在离开该函数之前,我必须从其中返回一个指针(假设为ret_ptr)并释放其他指针(所有othr_ptrs)。 我在此函数中有多个出口点(其中ret_ptr为0或它指向有效的内存或异常)。 因此,在所有return语句之前和在exception ...
推进对象状态时,对简单对象和指针交换使用std::swap效果很好。 对于其他就地操作, Boost.ScopeExit可以很好地工作,但是如果您要在函数之间共享出口处理程序,则不是很优雅。 是否存在C ++ 11本机方式来完成类似于Boost.ScopeExit但允许更好的代码重用? ...
C ++ 我正在尝试查看const引用如何延长临时对象的寿命。 我正在从摘录中运行代码,这些答案之一是C ++中的指针变量和引用变量之间有什么区别? 并且在VC11和g ++ 4.8之间得到了冲突的结果。 我在这里扩展了代码段: 回答者得到了结果: 我在VC11中进行 ...
是调用者还是被调用者复制或移动函数的返回值? 例如,如果我想实现队列的pop()函数,就像这样 是复制前面元素后调用的范围内容的析构函数? 编辑:后续问题:行 现在是非常安全的吗? ...
我为C函数对编写了一个RAII包装器,用于初始化和释放资源,在大多数情况下它都很适合我。 但是,当一个函数像Enter/LeaveCriticalSection一样返回void时,我不知道如何在这个类中执行它。 我应该专门为SuccessValueType = void case的类吗 ...
资源获取初始化(RAII)习惯用法和try-finally语句构成了编写异常安全编程的传统方法的支柱。 我的问题是:C#上是否有类似Scope Guard声明的内容 ? ...
我正在尝试基于 Alexandrescu 概念编写一个简单的 ScopeGuard,但使用 c++11 习语。 这是用法: 由于我的版本比那里的大多数示例(如 Boost ScopeExit)短得多,我想知道我遗漏了哪些专业。 希望我在这里处于 80/20 的场景中(我用 20% 的代码行获得了 ...
在此文章中的支护参数的参考部分,他们指出的问题,并提供解决引用。 我的问题是:为什么他们不首先将参数声明为引用? 即,而不是: 做: ...
我已经在DDJ中阅读了关于范围保护的文章( 通用:改变你编写异常安全代码的方式 - 永远 ),我理解它们的常用用法。 但是,常见的用途是在堆栈上为特定操作实例化特定堆栈保护,例如: 但是,如果我想在运行时安排清理操作,例如当我有一个循环时,该怎么办: 显然,上面的例子不起作 ...
我在多年前看到 Andrei Alexandrescu 和 Petru Marginean 写的这篇文章,其中介绍并讨论了一个名为 ScopeGuard 的实用程序类,用于编写异常安全代码。 我想知道使用这些对象进行编码是否真的会产生更好的代码,或者它是否会混淆错误处理,因为也许守卫的回调会更好地呈 ...