问题标签 [resource-management]

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 投票
5 回答
2063 浏览

java - 关闭嵌套阅读器

从文本文件读取时,通常会创建 aFileReader然后将其嵌套在BufferedReader. 阅读完毕后,我应该关闭两个阅读器中的哪一个?有关系吗?

当谈到异常安全时,我有点偏执。当BufferedReader构造函数抛出异常时会发生什么?它会关闭嵌套阅读器吗?还是保证不扔?

0 投票
4 回答
5729 浏览

f# - 为什么使用比使用更好?

根据此 MSDN 页面 use上的最后一句话是要优先于using. 我在其他地方听说过(例如这个答案)。为什么是这样?我意识到use是后来添加的。但是有什么区别呢?从表面上看,using似乎更有用,因为您可以控制何时Dispose()调用,并且(fun _ -> ...)如果需要,您可以显式忽略绑定值(例如, )。

0 投票
2 回答
838 浏览

java - 我是否必须在应用程序退出时手动关闭执行程序?

假设我的Executor executor;应用程序中有一个地方。只是像往常一样说并让“系统”处理它就足够了setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);吗,还是我必须executor.shutdown();在应用程序退出之前注册一个侦听器并手动调用?

0 投票
6 回答
178 浏览

scala - 关闭存储在 Option[ ] 中的资源

我有一个存储在选项中的资源对象。

在程序执行期间ochan的某个时刻,设置为Some(channel)。我想关闭通道(通过调用方法close)并将选项设置为None一举致命。

目前我有:

以前我有:

有一个更好的方法吗?

0 投票
9 回答
17961 浏览

java - 在 Java 中处理 IO 异常

基本上,我想打开一个文件,读取一些字节,然后关闭该文件。这就是我想出的:

也许我被 RAII 宠坏了,但在 Java 中一定有更好的方法来做到这一点,对吧?

0 投票
6 回答
2162 浏览

c++ - 如果 delete[] p 失败会发生什么?

假设我有一个指向动态分配的 10 个元素的数组的指针:

稍后,我想释放该数组:

如果其中一个T析构函数抛出异常会发生什么?其他元素还会被破坏吗?内存会被释放吗?异常会被传播,还是会终止程序执行?

同样,当 astd::vector<T>被销毁并且其中一个T析构函数抛出时会发生什么?

0 投票
2 回答
123 浏览

operating-system - (POSIX)操作系统是否会在进程崩溃后恢复资源?

假设我们有一个进程分配一个侦听特定端口的套接字,对其进行处理,然后异常终止。现在第二个进程启动并希望分配一个套接字,该套接字侦听先前由崩溃进程持有的同一端口。这个套接字可以重新分配吗?

  • 操作系统如何恢复未正确释放的资源?操作系统是否跟踪进程 ID 以及每个分配的资源?

  • 这种清理是我可以期望每个符合 POSIX 的系统都做的事情吗?

0 投票
3 回答
2002 浏览

python - MySQLdb 最佳实践

我目前正在开发一个 Python 脚本,它使用从 MySQL 数据库中提取的一些数据来做一些事情。为了访问这些数据,我使用了模块MySQLdb

该模块遵循PEP 249,Python DB API中规定的指南,并涉及创建连接对象和后续游标对象,用于迭代信息。

目前,在我的项目中,每当我需要执行 MySQL 读/写块时,我都会创建一个连接对象,然后在完成后关闭它。但是,我可以轻松地传递连接对象以避免这些重复的打开/关闭。

我的问题是:考虑到安全性、资源管理等,open; read/write; close; repeat for the next read/write;方法论比open; read/write; pass connection on for the next read/write;方法好吗?

编辑:更多的上下文。这个特定的 Python 脚本是高度多线程的。复杂的进程/线程环境是否会影响哪种方法更合适?

0 投票
12 回答
16128 浏览

java - 锁可以自动关闭吗?

Locks可以自动关闭吗?也就是说,而不是:

...我能说......么:

...在 Java 7 中?

0 投票
2 回答
785 浏览

c# - C++/CLI 库中的早期终结和内存泄漏

在我正在处理的 C++/CLI(和 C#)项目中,我遇到了似乎在早期调用终结器的问题。这似乎是一个非常复杂的问题,我将从代码中提到很多不同的类和类型。幸运的是,它是开源的,您可以在此处关注:Pstsdk.Net(mercurial 存储库) 我还尝试在适当的情况下直接链接到文件浏览器,这样您就可以在阅读时查看代码。我们处理的大部分代码都在pstsdk.mcpp存储库的文件夹中。

现在的代码处于相当可怕的状态(我正在处理它),而我正在处理的代码的当前版本在Finalization fixes (UNSTABLE!)分支中。该分支中有两个变更集,为了理解我冗长的问题,我们需要同时处理这两个。(变更集:ee6a002df36fa12e9f5ea9fe

对于某些背景,该项目是用 C++编写的非托管库的 C++/CLI 包装器。我不是该项目的协调员,我不同意几个设计决策,因为我相信很多看代码的人都会,但我离题了。我们将大部分原始库的层封装在 C++/CLI dll 中,但在 C# dll 中公开易于使用的 API。这样做是因为该项目的目的是将整个库转换为托管 C# 代码。

如果您能够获得要编译的代码,则可以使用此测试代码来重现问题。


问题

名为 的最新变更集moved resource management code to finalizers, to show bug显示了我遇到的原始问题。此代码中的每个类都使用相同的模式来释放非托管资源。这是一个示例(C++/CLI):

这段代码有两个好处。首先,当这样的类在using语句中时,资源会立即被适当地释放。其次,如果用户忘记了一个 dispose,当 GC 最终决定终结类时,非托管资源将被释放。

这是这种方法的问题,我根本无法理解,有时,GC 会决定最终确定一些用于枚举文件中数据的类。这发生在许多不同的 PST 文件中,我已经能够确定它与被调用的 Finalize 方法有关,即使该类仍在使用中。

我可以通过这个文件(下载)1始终如一地实现它。提前调用的终结器位于DBAccessor.cpp文件中的NodeIdCollection类中。如果您能够运行上面链接的代码(由于对 boost 库的依赖,此项目可能难以设置),应用程序将失败并出现异常,因为列表设置为 null 并且指针为由于终结器运行而重置。_nodes_db_

1) 类中的枚举代码是否有任何明显的问题NodeIdCollection会导致 GC 在该类仍在使用时完成它?

我只能通过下面描述的解决方法使代码正常运行。


一个难看的解决方法

!classname现在,我能够通过将所有资源管理代码从每个终结器 ( ) 移动到析构函数 ( )来解决这个问题~classname。这已经解决了这个问题,尽管它并没有解决我对为什么课程提前完成的好奇。

但是,这种方法存在问题,我承认这更多的是设计问题。由于在代码中大量使用了指针,几乎每个类都处理自己的资源,并要求处理每个类。这使得使用枚举非常难看(C#):

作用于集合中项目的 using 语句对我来说是错误的,但是,使用该方法非常有必要防止任何内存泄漏。没有它,即使调用了 pst 类的 dispose 方法,也永远不会调用 dispose 并且永远不会释放内存。

我有意改变这种设计。最初编写此代码时的基本问题,除了我对 C++/CLI 知之甚少甚至一无所知的事实之外,我无法将本机类放入托管类中。我觉得可以使用作用域指针,当类不再使用时会自动释放内存,但我不能确定这是否是一种有效的方法,或者它是否可以工作。所以,我的第二个问题是:

2) 以轻松的方式处理托管类中的非托管资源的最佳方法是什么?

clr_scoped_ptr详细地说,我可以用最近添加到代码中的包装器替换本机指针吗(来自这个stackexchange问题的 clr_scoped_ptr.h )。或者我是否需要将本机指针包装在 a or之类的东西中?scoped_ptr<T>smart_ptr<T>


感谢您阅读所有这些,我知道这很多。我希望我已经足够清楚,以便我可以从比我更有经验的人那里获得一些见解。这是一个很大的问题,我打算在允许的情况下增加赏金。希望有人可以提供帮助。

谢谢!


1此文件是可免费获得的 PST 文件安然数据集的一部分