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

java - 当一种语言不支持析构函数时,如何对堆栈展开做出反应?

假设您已经创建了一个Window类的实例。该窗口显示给用户。然后,抛出异常,对实例的引用丢失,但用户仍然可以看到窗口,因为实例仍然存在(只是不再被引用)。

在这些情况下该怎么办?

我专门讨论的是 Squirrel 脚本语言 (http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally块或终结器方法,那么这种语言中的异常处理是否被破坏了?

0 投票
3 回答
640 浏览

stack - D 中基于堆栈的对象实例化

我正在学习 D,并且对我遇到的错误感到困惑。

考虑以下:

产生一个非常可敬的:

现在考虑当我尝试在堆栈上初始化 PerformanceCounter 而不是使用托管堆时会发生什么:

产量:

我难住了。关于为什么会中断的任何想法?(Mac OS X 10.6.4 上的 DMD 2.049)。在此先感谢您对 n00b 的帮助。

0 投票
4 回答
606 浏览

c++ - 当 RAII 对象构造失败时

假设我构造了一个 RAII 对象,而该对象可能构造失败。我该如何处理?

当然,默认构造函数std::vector不会抛出,这可以提供帮助,但这不是一般情况。构造函数很可能会抛出。如果我想处理任何资源获取失败,如果它没有抛出,我该如何处理?

编辑:澄清一下,我的问题是,如果资源无法获取,那么我可能想再试一次,依此类推。也许我可以尝试获取替代资源。

0 投票
3 回答
332 浏览

c++ - 当我们在 C++ 中遵循“RAII”的做事方式时,是否需要有静态构造函数?

如果我要遵循 RAII 规则并使用 C++ 开发一个类,是否有必要使用静态构造函数?静态构造函数会以任何方式帮助我还是会是错误的一步?

0 投票
1 回答
192 浏览

c++ - 为什么通过模板使用 operator<< 时需要重载?

正如在这个问题中一样,我正在尝试使用 SBRM/RAII 通过一个类进行流式传输,所以

可以在析构函数中做一些额外的事情,但我的模板知识似乎有限。

我所拥有的(为了清楚起见而变得更简单)是:

这类作品:

但我主要关心的是:为什么编译器要求我在使用(非字符串)文字时重载模板?
有什么技巧可以避免这种情况还是我采取了错误的方法?欢迎其他建议,因为我现在求助于使用宏

gcc 4.1.2 出现了这个问题。和 4.4.3。没有重载函数,我得到:

0 投票
5 回答
357 浏览

c++ - 可选元素是否会破坏 RAII,如果是,有什么更好的方法?

我有一个二维单元格矩阵。通常只有不可见的算法适用于这些单元格。但有时我想可视化每个单元格,所以我添加了一个指向图形对象的指针

Cell 的构造函数将representation_ 设置为0。有时另一个Visualization 类会在矩阵上进行迭代,并将元素添加到Cells 中,通过颜色将每个单元格的内容可视化。

我认为这打破了 RAII 范式。你有更好的方法吗?

我可以创建另一个二维矩阵并从那里链接到原始矩阵,以便指针位于可视化端,但那时我需要两个矩阵。

0 投票
2 回答
178 浏览

c++ - 如何将删除器传递给由 shared_ptr 持有的同一类中的方法

我有几个来自 3rd 方库的类,类似于 StagingConfigDatabase 类,它需要在创建后被销毁。我正在为 RAII 使用 shared_ptr,但我更愿意使用一行代码创建 shared_ptr,而不是像我的示例所示那样使用单独的模板仿函数。也许使用 lambdas?或绑定?

我正在考虑类似的事情:

但这不编译:(

帮助!

0 投票
1 回答
287 浏览

objective-c - Objective-C 中的引用计数注意事项?

长期以来,我一直认为自己是一个垃圾收集势利小人——尽管对 C++ 有着秘密的热爱,但我发现自己在嘲笑那些积极选择使用没有(阅读:缺失)垃圾收集的语言的开发人员。

然后我遇到了Objective-C。哇!它的引用计数系统看起来非常简单——我什至可以说是优雅的。在为 OSX 开发时,开发人员可以选择使用时髦的 GC;在为 iOS 开发时,开发人员被引用计数困住了。

我的问题是:

如果我正在开发一个可能被移植到 iOS 的 OSX 应用程序,Objective-C 的引用计数系统是否足够耗时(开发方面和错误修复方面)以保证在应用程序的第一个版本中忽略它?

如果我依赖引用计数*,我可能会遇到什么问题,假设我不够聪明,无法构建任何极其复杂的循环数据结构?有了类似的功能autorelease这一切看起来都那么简单,但我知道如果真的是这样,Apple 就不会投入精力来创建垃圾收集器。我应该注意什么?

* 我知道我可以使用垃圾收集器,即使我扔掉retains 和releases(它们会被忽略)。但是,考虑到非 GC 应用程序经常使用RAII,我不明白如果分代 GC 要“替换”对retainand的调用,那将如何工作release。资源不会延迟释放吗?

0 投票
3 回答
554 浏览

language-agnostic - 为什么 RAII 和垃圾收集相互排斥?

虽然我认为我理解问题的要点(即一个好的 GC 跟踪对象,而不是范围),但我对主题的了解不足以说服其他人。

你能解释一下为什么没有带有确定性析构函数的垃圾收集语言吗?

0 投票
4 回答
2710 浏览

php - PHP 是否支持 RAII 模式?如何?

PHP 上的大多数资源从不涉及内存管理,因为语言本身非常擅长为您做这件事。然而,在 PHP 中,您经常会处理非内存的外部资源——数据库句柄、会话、数据库事务等。这些外部资源可以使用某种形式的 RAII 对象进行最干净的管理。

我最初认为 PHP 使用了类似于 JVM 或 CLR 的垃圾收集方案,其中不存在析构函数的概念。(记住:每个人都以错误的方式看待垃圾收集——终结器不是析构函数!)有一种特殊的__destruct方法,但我认为这是一个类似于 Java 或 C# 终结器的“终结器”。出于这个原因,您不能在 JVM 或 CLR 上使用 RAII(C# 的using块可以让您完成大约 95% 的工作,但这有点不同......)。

然而,谷歌似乎表明 PHP 支持 RAII 模式,尽管我在 PHP 文档中找不到对此的验证。语言是否支持这一点并且是否将清理逻辑__destruct用于完成 RAII 任务?