c++ - 当我想保留对象中的一些数据但不是全部时,如何管理内存?
问题描述
我在 C++ 中的内存管理方面没有经验。我有一个Magick::Image
包含大图像(400MB)的类,我一次不需要加载超过一个完整的图像位图。我确实希望加载许多包含元数据的对象,例如分辨率、位深度和其他与图像相关的小信息,并且我希望能够以某种方式检索位图数据(或指向位图数据的指针)这些对象中的调用。
我的解决方案是有一个ImageFile
类来保存元数据和指向位图的指针,并且还有允许我加载和卸载位图数据的方法load()
。unload()
然后我可以拥有许多带有元数据的对象,当我需要其中任何一个的位图时,我可以调用load()
,完成后我可以调用unload()
.
不幸的是,这给我带来了一个问题:可以将 ImageFile 指针传递给函数并在它处于卸载状态时访问它的位图。在这种情况下,我可以(1)抛出异常或(2)我可以自动加载图像。由于以下原因,这两个对我来说似乎都很糟糕:
- 在我看来,从哲学上讲,如果您有某个类的实例,那么该实例应该始终处于功能/工作状态。拥有可能处于非工作状态的实例似乎需要添加额外的代码和检查并增加程序复杂性。我可能在这里弄错了。
- 如果我在需要位图的方法调用后自动加载图像,那么我什么时候卸载?对象无法知道位图是否会很快再次使用,因此无法自动完成(可以吗?)。似乎每次都需要手动卸载,此时自动加载毫无意义,因为无论如何我们都必须进行手动工作。
由于这些原因,我被引导相信我的ImageFile
解决方案是一种不好的做法。如何以更强大的方式实现我需要的东西?
解决方案
推荐阅读
- php - 如何让用户只发布一次自定义帖子类型(php / wordpress)?
- sql - 如何在 Mac 上的 hive 中将数据加载到表中
- c# - 在 Excel 中导出网格的逻辑
- javascript - 如何更改特定网格框的背景颜色?
- python - 使用 Pandas python 复制文件并上传到另一个 csv 文件
- oracle - REGEXP_SUBSTR 匹配后删除所有字符
- python - 为什么 pandas 将 UNIX 时间戳转换为多个不同的日期时间值?
- amazon-web-services - 使用 NATGW 创建 VPC/IGW、VPN 和私有子网的 Terraform 项目 - 连接分析器说没有从 NATGW 到 IGW 的路由
- google-sheets - 如何使用 vlookup 或索引/匹配来返回公式而不是值?
- mysql - 转换表以获取所需的数据