首页 > 解决方案 > 当我想保留对象中的一些数据但不是全部时,如何管理内存?

问题描述

我在 C++ 中的内存管理方面没有经验。我有一个Magick::Image包含大图像(400MB)的类,我一次不需要加载超过一个完整的图像位图。我确实希望加载许多包含元数据的对象,例如分辨率、位深度和其他与图像相关的小信息,并且我希望能够以某种方式检索位图数据(或指向位图数据的指针)这些对象中的调用。

我的解决方案是有一个ImageFile类来保存元数据和指向位图的指针,并且还有允许我加载和卸载位图数据的方法load()unload()然后我可以拥有许多带有元数据的对象,当我需要其中任何一个的位图时,我可以调用load(),完成后我可以调用unload().

不幸的是,这给我带来了一个问题:可以将 ImageFile 指针传递给函数并在它处于卸载状态时访问它的位图。在这种情况下,我可以(1)抛出异常或(2)我可以自动加载图像。由于以下原因,这两个对我来说似乎都很糟糕:

  1. 在我看来,从哲学上讲,如果您有某个类的实例,那么该实例应该始终处于功能/工作状态。拥有可能处于非工作状态的实例似乎需要添加额外的代码和检查并增加程序复杂性。我可能在这里弄错了。
  2. 如果我在需要位图的方法调用后自动加载图像,那么我什么时候卸载?对象无法知道位图是否会很快再次使用,因此无法自动完成(可以吗?)。似乎每次都需要手动卸载,此时自动加载毫无意义,因为无论如何我们都必须进行手动工作。

由于这些原因,我被引导相信我的ImageFile解决方案是一种不好的做法。如何以更强大的方式实现我需要的东西?

标签: c++oopmemorymemory-management

解决方案


推荐阅读