问题标签 [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.
c++ - DuplicateHandle的价格
我正在编写一个类库,为 Windows 注册表的 C API 提供方便的面向对象前端。然而,我很好奇,处理HREG
s 的最佳做法是什么,例如我的key
类被复制的情况。
我可以
- 分配一个堆整数并将其用作引用计数。在句柄上调用 RegCloseKey() 并在引用计数为零时释放整数。
- 使用句柄的内置功能,而不是维护引用计数,而是
DuplicateHandle()
在复制注册表项对象时调用 HREG。然后总是在析构函数中调用 RegCloseKey。
DuplicateHandle()
设计要简单得多,但我担心以这种方式设计的东西是否会严重影响应用程序的性能。因为我的应用程序通过数十万个键进行递归,所以复制此对象的速度是一个敏感问题。
DuplicateHandle()
该函数的固有开销是什么?
c# - 在 C# 中使用 RAII 是否安全?和其他垃圾收集语言?
我正在制作一个接收 System.Windows.Form 控件并设置其光标的 RAII 类。在析构函数中,它将光标设置回原来的样子。
但这是一个坏主意吗?当此类的对象超出范围时,我可以安全地依赖析构函数将被调用吗?
c++ - 在构造函数中创建模式名称,在析构函数中删除 (C++)
传统上,在 C++ 中,您将在构造函数中创建任何依赖项并在析构函数中删除它们。
这种资源获取的技术/模式,有没有通用的名称?
我很确定我在某处读过它,但现在找不到。
编辑:
正如许多人指出的那样,这个类是不完整的,应该真正实现一个复制构造函数和赋值运算符。
最初,我故意将其省略,因为它与实际问题无关:模式的名称。但是,为了完整性和鼓励良好实践,公认的答案就是这样。
c++ - 对象的共享所有权是糟糕设计的标志吗?
背景:在阅读Stroustrup 博士的论文和常见问题解答时,我注意到一些来自传奇 CS 科学家和程序员的强烈“意见”和很好的建议。其中之一是关于shared_ptr
C++0x 的。他开始解释shared_ptr
以及它如何表示指向对象的共享所有权。在最后一行,他说,我引用:
. A
shared_ptr
代表共享所有权,但共享所有权不是我的理想:如果一个对象有一个明确的所有者和一个明确的、可预测的生命周期,那就更好了。
我的问题:RAII 在多大程度上替代了垃圾收集等其他设计模式?我假设手动内存管理不用于表示系统中的共享所有权。
c++ - 如何解决在 C++ 中同时使用 RAII 代码和非 RAII 代码的问题?
我们有 3 个不同的库,每个库都由不同的开发人员开发,并且每个库(大概)都设计得很好。但由于一些库使用 RAII,而另一些则不使用,并且一些库是动态加载的,而其他库则不是 - 它不起作用。
每个开发人员都说他所做的是正确的,并且仅针对这种情况进行方法更改(例如在 B 中创建 RAII 单例)可以解决问题,但看起来只是一个丑陋的补丁。
你会建议如何解决这个问题?
请查看代码以了解问题:
我的代码:
“A”代码(在另一个 Dll 中,静态链接到我的 Dll):
“B”代码(在另一个 Dll 中,从 A 动态加载):
java - RAII 可能在 Java 中?
http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
这种设计模式在 Java 中可行吗?如果是这样,怎么做?如果不是,为什么不呢?
谢谢!
c++ - 是否有一种具有 RAII + Ref 计数的语言没有不安全的指针算术?
RAII = 资源获取即初始化
参考计数=“穷人的GC”
它们一起非常强大(就像一个引用计数的 3D 对象持有一个 VBO,当它的析构函数被调用时它会抛出释放)。
现在,问题是——除了 C++ 之外,RAII 是否存在于任何语言中?特别是,不允许指针算术/缓冲区溢出的语言?
c++ - 是否保证在块结束之前不会调用 C++ 析构函数?
在下面的 C++ 代码中,我是否保证在执行 // More code之后会调用 ~obj() 析构函数?或者如果编译器检测到它没有被使用,是否允许编译器更早地破坏它?
我想使用这种技术来避免我不得不记住在块的末尾重置一个标志,但我需要这个标志在整个块中保持设置。
lisp - 计划中的 RAII?
无论如何要实现资源获取是Scheme中的初始化?
我知道 RAII 在 GC-ed 语言中效果不佳(因为我们不知道对象何时被销毁)。然而,Scheme 有一些不错的东西,比如延续、动态风和闭包——有没有办法使用这些组合来实现 RAII?
如果不是,计划者如何设计他们的代码以不使用 RAII?
[我遇到的一个常见示例如下:
我有一个 3D 网格,我有一个顶点缓冲区对象附加到它,当不再使用网格时,我希望释放 VBO。]
谢谢!
c# - 使用 IDisposable 和“使用”作为获取“范围行为”以实现异常安全的手段是否滥用?
我在 C++ 中经常使用的东西是让一个类通过构造函数和析构函数A
处理另一个类的状态进入和退出条件,以确保如果该范围内的某些东西抛出异常,那么 B 在范围已退出。就首字母缩略词而言,这并不是纯粹的 RAII,但它仍然是一种既定模式。B
A
在C#中,我经常想做
需要这样做
如果我想保证返回Frobble
时的状态FiddleTheFrobble
。代码会更好
FrobbleJanitor
看起来大致像_
这就是我想要做的。现在现实赶上了,因为我想要使用的东西需要与. 我可以认为这是一个代码审查问题,但有些事情困扰着我。FrobbleJanitor
using
问题:以上是否会被视为滥用using
and IDisposable
?