在C++中,我们有资源获取初始化(RAII)模式,这极大地简化了资源管理.我们的想法是为任何类型的资源提供一些包装对象.然后,包装对象的析构函数负责在资源超出其范围时释放资源.例如:
{
auto_ptr<int> smartPointer = new int;
// some other code
} // the memory allocated for the int is released automatically
// by smartPointer's destructor
Run Code Online (Sandbox Code Playgroud)
最常见的用法是智能指针.但是,还有许多其他类型的资源(文件,互斥锁,套接字等)可以以完全相同的方式进行管理.
在Java中,不必打扰内存管理.但所有其他类型的资源仍然存在.还有最后块,但它的使用是非常不方便,尤其是当许多不同的异常可以被抛出.
所以,我的问题是,是否有任何Java模式提供相当于C++ RAII的功能?如果没有,请分享您在这个领域的最佳实践(而不是最终,除非它使用一些复杂的方式).
当我开发我的应用程序时,我已导入并合并了大量图像,声音等.我想我可以编写一个shell脚本来查看源代码,但我想知道是否存在可识别任何内容的我项目中未使用的资源.
谢谢!
如果我使用IDisposable实现一个对象,那么拥有该对象的所有对象是否也应该实现它,即使它们没有其他资源可以释放?
interface IMyInterace
{
void Open();
object Read();
void Close();
}
class MyImplementation : IMyInterface
{
public void Open() { /* instantiates disposible class */ }
//...
public void Close() { /* calls .Dispose(); */ }
}
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法来处理这种情况,以确保调用类中的可处理实例?(除了文档之外,调用者没有信号他们必须调用'Close'.)IMyInterface的实现不一定封装IDisposible实例,并且在整个应用程序的生命周期内重复关闭和重新打开.
我在想这样做:
IMyInterface的用户不知道他们正在使用什么实现,所以我不确定MyImplementation可处置的价值有多少,而且并非所有实现都会封装IDisposibles.
我目前正在开发一个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脚本是多线程的.复杂的进程/线程环境是否会影响哪种方法更合适?
我想使用以下资源分配运行两个容器:
如果我以这种方式运行这两个容器:
docker run -d --name='C1' --cpu-shares=20 --cpuset-cpus="1,2" progrium/stress --cpu 2
docker run -d --name='C2' --cpu-shares=80 --cpuset-cpus="2,3" progrium/stress --cpu 2
Run Code Online (Sandbox Code Playgroud)
我得到C1取c 100的100%作为预期,但50%的cpu2(而不是20%),C2取c 100预期的100%和cpu2的50%(而不是80%).
看起来像--cpu-shares选项被忽略了.有没有办法获得我正在寻找的行为?
我正在使用文档中概述的循环结构的修改版本运行HTTP :: Daemon的本地实例.我已经可以根据用户的请求退出循环,但后续执行我的Perl脚本会给我错误:
HTTP ::守护程序:已在使用的地址...在/ path /到/脚本行NNN,第3行传播.
在守护进程之后,我还必须做些什么来成为一个好公民并清理干净?
perl daemon memory-management resource-management http-daemon
我有一个SpriteManager类,为我加载和缓存精灵,并从缓存中删除未使用的精灵.无论如何,这是个主意,我有点卡住了.我有一个map<string,weak_ptr<ALLEGRO_BITMAP>>存储sprite的地方,并使用weak_ptr来生成shared_ptr.现在我正在尝试使用也从地图中删除位图的删除器,它看起来像这样(显然不起作用):
[&bitmaps](ALLEGRO_BITMAP* bmp){
for(auto it = bitmaps.begin(); it!=bitmaps.end(); ++it) {
if((*it).second == bmp) {
bitmaps.erase(it);
al_destroy_bitmap(bmp);
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
位图是我正在谈论的地图.当然,我不能比较(*it).second和bmp,但我也因为我在缺失者是无法锁定的weak_ptr.除了保持弱指针和原始指针外,我真的别无选择吗?
我有一个简单的序列表达式,它使用了一个我想在我完成时清理的资源:
type MyObject() =
member this.Items =
seq {
use resource = ResourcePool.Get()
let c = resource.ValueCount
if c > 0 then
for i in 0 .. c - 1 do
yield resource.GetValue i
}
Run Code Online (Sandbox Code Playgroud)
如果我然后使用序列迭代,例如,在项目的中途进行迭代,那么资源何时会被处置?
例如:
// ...
let foo = MyObject
let item = foo.Items |> Seq.find ( fun i -> i.Name = "name" )
// ...
Run Code Online (Sandbox Code Playgroud)
将resource在Seq.find完成后处理?或者我是否需要重新考虑我的资源管理策略?
假设我有一个管理器类,其中包含某个对象的向量:
class SomeObjectManager
{
private:
std::vector<SomeObject> _heldObjects;
};
Run Code Online (Sandbox Code Playgroud)
在那个类中,我有一些函数可以遍历所述向量以返回请求的对象。
SomeObject getSomeObjectByName(std::string nameToFind);
Run Code Online (Sandbox Code Playgroud)
我需要知道的是什么时候使用智能指针是合适的。我真的应该返回如下内容吗?
std::shared_ptr<SomeObject> getSomeObjectByName(std::string nameToFind);
Run Code Online (Sandbox Code Playgroud)
或者我应该使用诸如 unique_ptr 或 weak_ptr 之类的其他东西吗?我希望 SomeObjectManager 类拥有返回的实际对象,并且永远不会说 SomeObject 被删除,除非 Manager 这样做。
我在 C# 模式下工作了一段时间后,最近才回到 C++ 世界;感谢您的帮助并消除我的困惑。
我已经阅读了很多关于这件事的书,但从未真正找到针对我的特定情况的直接答案。
编辑 #1
我想用这个改写我的最后几句话:
我希望 SomeObjectManager 类拥有返回的实际对象,并且从未说过 SomeObject 从向量中删除并随后被删除,超出范围,直到 Manager 强制它这样做。例如:
void SomeObjectManager::removeSomeObjectByName(const std::string& objectToRemove);
Run Code Online (Sandbox Code Playgroud)
这只会迭代向量,找到 said SomeObject,然后从向量中删除它。
c++ smart-pointers resource-management shared-ptr unique-ptr
c++ ×2
idisposable ×2
shared-ptr ×2
.net ×1
c# ×1
c++11 ×1
containers ×1
cpu-cores ×1
daemon ×1
docker ×1
f# ×1
http-daemon ×1
iphone ×1
java ×1
mysql ×1
mysql-python ×1
perl ×1
python ×1
raii ×1
sequence ×1
unique-ptr ×1
weak-ptr ×1
xcode ×1