问题标签 [raii]

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 投票
2 回答
597 浏览

c++ - DuplicateHandle的价格

我正在编写一个类库,为 Windows 注册表的 C API 提供方便的面向对象前端。然而,我很好奇,处理HREGs 的最佳做法是什么,例如我的key类被复制的情况。

我可以

  1. 分配一个堆整数并将其用作引用计数。在句柄上调用 RegCloseKey() 并在引用计数为零时释放整数。
  2. 使用句柄的内置功能,而不是维护引用计数,而是DuplicateHandle()在复制注册表项对象时调用 HREG。然后总是在析构函数中调用 RegCloseKey。

DuplicateHandle()设计要简单得多,但我担心以这种方式设计的东西是否会严重影响应用程序的性能。因为我的应用程序通过数十万个键进行递归,所以复制此对象的速度是一个敏感问题。

DuplicateHandle()该函数的固有开销是什么?

0 投票
4 回答
2122 浏览

c# - 在 C# 中使用 RAII 是否安全?和其他垃圾收集语言?

我正在制作一个接收 System.Windows.Form 控件并设置其光标的 RAII 类。在析构函数中,它将光标设置回原来的样子。

但这是一个坏主意吗?当此类的对象超出范围时,我可以安全地依赖析构函数将被调用吗?

0 投票
3 回答
1129 浏览

c++ - 在构造函数中创建模式名称,在析构函数中删除 (C++)

传统上,在 C++ 中,您将在构造函数中创建任何依赖项并在析构函数中删除它们。

这种资源获取的技术/模式,有没有通用的名称?
我很确定我在某处读过它,但现在找不到。

编辑:
正如许多人指出的那样,这个类是不完整的,应该真正实现一个复制构造函数和赋值运算符。
最初,我故意将其省略,因为它与实际问题无关:模式的名称。但是,为了完整性和鼓励良好实践,公认的答案就是这样。

0 投票
4 回答
1401 浏览

c++ - 对象的共享所有权是糟糕设计的标志吗?

背景:在阅读Stroustrup 博士的论文和常见问题解答时,我注意到一些来自传奇 CS 科学家和程序员的强烈“意见”和很好的建议。其中之一是关于shared_ptrC++0x 的。他开始解释shared_ptr以及它如何表示指向对象的共享所有权。在最后一行,他说,我引用

. Ashared_ptr代表共享所有权,但共享所有权不是我的理想:如果一个对象有一个明确的所有者和一个明确的、可预测的生命周期,那就更好了。

我的问题:RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权。

0 投票
5 回答
672 浏览

c++ - 如何解决在 C++ 中同时使用 RAII 代码和非 RAII 代码的问题?

我们有 3 个不同的库,每个库都由不同的开发人员开发,并且每个库(大概)都设计得很好。但由于一些库使用 RAII,而另一些则不使用,并且一些库是动态加载的,而其他库则不是 - 它不起作用。

每个开发人员都说他所做的是正确的,并且仅针对这种情况进行方法更改(例如在 B 中创建 RAII 单例)可以解决问题,但看起来只是一个丑陋的补丁。

你会建议如何解决这个问题?

请查看代码以了解问题:


我的代码:


“A”代码(在另一个 Dll 中,静态链接到我的 Dll):


“B”代码(在另一个 Dll 中,从 A 动态加载):

0 投票
2 回答
423 浏览

java - RAII 可能在 Java 中?

http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

这种设计模式在 Java 中可行吗?如果是这样,怎么做?如果不是,为什么不呢?

谢谢!

0 投票
6 回答
579 浏览

c++ - 是否有一种具有 RAII + Ref 计数的语言没有不安全的指针算术?

RAII = 资源获取即初始化

参考计数=“穷人的GC”

它们一起非常强大(就像一个引用计数的 3D 对象持有一个 VBO,当它的析构函数被调用时它会抛出释放)。

现在,问题是——除了 C++ 之外,RAII 是否存在于任何语言中?特别是,不允许指针算术/缓冲区溢出的语言?

0 投票
8 回答
8726 浏览

c++ - 是否保证在块结束之前不会调用 C++ 析构函数?

在下面的 C++ 代码中,我是否保证在执行 // More code之后会调用 ~obj() 析构函数?或者如果编译器检测到它没有被使用,是否允许编译器更早地破坏它?

我想使用这种技术来避免我不得不记住在块的末尾重置一个标志,但我需要这个标志在整个块中保持设置。

0 投票
1 回答
746 浏览

lisp - 计划中的 RAII?

无论如何要实现资源获取是Scheme中的初始化?

我知道 RAII 在 GC-ed 语言中效果不佳(因为我们不知道对象何时被销毁)。然而,Scheme 有一些不错的东西,比如延续、动态风和闭包——有没有办法使用这些组合来实现 RAII?

如果不是,计划者如何设计他们的代码以不使用 RAII?

[我遇到的一个常见示例如下:

我有一个 3D 网格,我有一个顶点缓冲区对象附加到它,当不再使用网格时,我希望释放 VBO。]

谢谢!

0 投票
12 回答
6868 浏览

c# - 使用 IDisposable 和“使用”作为获取“范围行为”以实现异常安全的手段是否滥用?

我在 C++ 中经常使用的东西是让一个类通过构造函数和析构函数A处理另一个类的状态进入和退出条件,以确保如果该范围内的某些东西抛出异常,那么 B 在范围已退出。就首字母缩略词而言,这并不是纯粹的 RAII,但它仍然是一种既定模式。BA

在C#中,我经常想做

需要这样做

如果我想保证返回Frobble时的状态FiddleTheFrobble。代码会更好

FrobbleJanitor看起来大致像_

这就是我想要做的。现在现实赶上了,因为我想要使用的东西需要与. 我可以认为这是一个代码审查问题,但有些事情困扰着我。FrobbleJanitor using

问题:以上是否会被视为滥用usingand IDisposable