问题标签 [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.
java - 关闭嵌套阅读器
从文本文件读取时,通常会创建 aFileReader
然后将其嵌套在BufferedReader
. 阅读完毕后,我应该关闭两个阅读器中的哪一个?有关系吗?
当谈到异常安全时,我有点偏执。当BufferedReader
构造函数抛出异常时会发生什么?它会关闭嵌套阅读器吗?还是保证不扔?
java - 我是否必须在应用程序退出时手动关闭执行程序?
假设我的Executor executor;
应用程序中有一个地方。只是像往常一样说并让“系统”处理它就足够了setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
吗,还是我必须executor.shutdown();
在应用程序退出之前注册一个侦听器并手动调用?
scala - 关闭存储在 Option[ ] 中的资源
我有一个存储在选项中的资源对象。
在程序执行期间ochan
的某个时刻,设置为Some(channel)
。我想关闭通道(通过调用方法close
)并将选项设置为None
一举致命。
目前我有:
以前我有:
有一个更好的方法吗?
java - 在 Java 中处理 IO 异常
基本上,我想打开一个文件,读取一些字节,然后关闭该文件。这就是我想出的:
也许我被 RAII 宠坏了,但在 Java 中一定有更好的方法来做到这一点,对吧?
c++ - 如果 delete[] p 失败会发生什么?
假设我有一个指向动态分配的 10 个元素的数组的指针:
稍后,我想释放该数组:
如果其中一个T
析构函数抛出异常会发生什么?其他元素还会被破坏吗?内存会被释放吗?异常会被传播,还是会终止程序执行?
同样,当 astd::vector<T>
被销毁并且其中一个T
析构函数抛出时会发生什么?
operating-system - (POSIX)操作系统是否会在进程崩溃后恢复资源?
假设我们有一个进程分配一个侦听特定端口的套接字,对其进行处理,然后异常终止。现在第二个进程启动并希望分配一个套接字,该套接字侦听先前由崩溃进程持有的同一端口。这个套接字可以重新分配吗?
操作系统如何恢复未正确释放的资源?操作系统是否跟踪进程 ID 以及每个分配的资源?
这种清理是我可以期望每个符合 POSIX 的系统都做的事情吗?
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 脚本是高度多线程的。复杂的进程/线程环境是否会影响哪种方法更合适?
java - 锁可以自动关闭吗?
Locks
可以自动关闭吗?也就是说,而不是:
...我能说......么:
...在 Java 7 中?
c# - C++/CLI 库中的早期终结和内存泄漏
在我正在处理的 C++/CLI(和 C#)项目中,我遇到了似乎在早期调用终结器的问题。这似乎是一个非常复杂的问题,我将从代码中提到很多不同的类和类型。幸运的是,它是开源的,您可以在此处关注:Pstsdk.Net(mercurial 存储库) 我还尝试在适当的情况下直接链接到文件浏览器,这样您就可以在阅读时查看代码。我们处理的大部分代码都在pstsdk.mcpp
存储库的文件夹中。
现在的代码处于相当可怕的状态(我正在处理它),而我正在处理的代码的当前版本在Finalization fixes (UNSTABLE!)
分支中。该分支中有两个变更集,为了理解我冗长的问题,我们需要同时处理这两个。(变更集:ee6a002df36f和a12e9f5ea9fe)
对于某些背景,该项目是用 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 文件安然数据集的一部分