标签: resource-management

C++是否可以像Java一样进行资源管理

在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的功能?如果没有,请分享您在这个领域的最佳实践(而不是最终,除非它使用一些复杂的方式).

java raii resource-management

5
推荐指数
2
解决办法
1606
查看次数

iPhone:是否有自动识别未使用资源的方法?

当我开发我的应用程序时,我已导入并合并了大量图像,声音等.我想我可以编写一个shell脚本来查看源代码,但我想知道是否存在可识别任何内容的我项目中未使用的资源.

谢谢!

iphone xcode resource-management

5
推荐指数
1
解决办法
888
查看次数

IDisposable链

如果我使用IDisposable实现一个对象,那么拥有该对象的所有对象是否也应该实现它,即使它们没有其他资源可以释放?

.net idisposable resource-management

5
推荐指数
1
解决办法
461
查看次数

如何处理一个类而不是封装一个可处理的实例?

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实例,并且在整个应用程序的生命周期内重复关闭和重新打开.

我在想这样做:

  • 在MyImplementation中实现IDisposible.
  • 设置Dispose()以调用Close().
  • 将Close()或Dispose()调用添加到Open的开头,以确保先前的调用已关闭.

IMyInterface的用户不知道他们正在使用什么实现,所以我不确定MyImplementation可处置的价值有多少,而且并非所有实现都会封装IDisposibles.

c# idisposable resource-management

5
推荐指数
2
解决办法
115
查看次数

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脚本是多线程的.复杂的进程/线程环境是否会影响哪种方法更合适?

python mysql resource-management mysql-python

5
推荐指数
1
解决办法
1786
查看次数

在Docker中混合cpu-shares和cpuset-cpus

我想使用以下资源分配运行两个容器:

  • 容器"C1":保留cpu1,共享cpu2,具有20个cpu-shares
  • 容器"C2":保留cpu3,共享cpu2,具有80个cpu-shares

如果我以这种方式运行这两个容器:

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选项被忽略了.有没有办法获得我正在寻找的行为?

containers resource-management cpu-cores docker

5
推荐指数
1
解决办法
882
查看次数

我的守护进程后如何清理?

我正在使用文档中概述的循环结构的修改版本运行HTTP :: Daemon的本地实例.我已经可以根据用户的请求退出循环,但后续执行我的Perl脚本会给我错误:

HTTP ::守护程序:已在使用的地址...在/ path /到/脚本行NNN,第3行传播.

在守护进程之后,我还必须做些什么来成为一个好公民并清理干净?

perl daemon memory-management resource-management http-daemon

4
推荐指数
1
解决办法
563
查看次数

将weak_ptr与原始指针进行比较不起作用,寻找替代方案

我有一个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).secondbmp,但我也因为我在缺失者是无法锁定的weak_ptr.除了保持弱指针和原始指针外,我真的别无选择吗?

c++ resource-management shared-ptr weak-ptr c++11

4
推荐指数
1
解决办法
376
查看次数

在序列表达式中使用"use"时的资源管理

我有一个简单的序列表达式,它使用了一个我想在我完成时清理的资源:

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完成后处理?或者我是否需要重新考虑我的资源管理策略?

f# sequence resource-management

4
推荐指数
1
解决办法
82
查看次数

返回智能指针

假设我有一个管理器类,其中包含某个对象的向量:

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

4
推荐指数
1
解决办法
1168
查看次数