当前位置: 首页 > news >正文

为什么我的软件内存占用这么高?从内存占用过高到C++内存管理方法

背景

在尝试写一个PDF文件标注软件时,需要将PDF文件转化为图片然后再展示给用户,同时允许用户在图片上做标注。

实现概况

假设用下面3各类:PDFFilePDFPageMark分别对应PDF文件,文件中的每个页面以及页面中的标注信息:

class Mark {Mark(QRect _pos);~Mark() = default;void paint();// ...
private:QRect pos;// ...
}class PDFPage {
public:PDFPage(QImage *_img);~PDFPage() = default;void paint();void addMark(Mark *mark);// ...
private:QImage *img;std::vector<Mark*> marks;// ...
}class PDFFile {
public:PDFFile(QString file_path);~PDFFile() = default;// ...
private:std::vector<PDFPage> pages;// ...
}

每次打开新的PDF文件,就会将保存PDF文件的PDFFile指针指向新的文件。

问题

上述实现貌似没什么问题,但当多次打开PDF文件时,内存占用会快速增加,每打开一个新的PDF文件,都会增加一部分内存占用,直至软件被操作系统kill。

假设为了PDF页面展示的清晰度,转化时做了放大,导致QImage占用的内存比较大。那么内存占用一直增大的原因是什么呢?

C++中常见的内存管理方法

上面代码的问题处在PDFPage的析构函数上,PDFPage用指针指向QImage,但在析构函数中并没有主动释放图片占用的大块内存,这就导致了内存泄漏,也就是程序内存一直增加直至crash。

修改PDFPage的析构函数如下,就能解决内存泄露的问题:

~PDFPage() {delete img;for (auto mark : marks) {delete mark;}
}

虽然上述析构函数能够解决内存泄漏的问题,但如果实现比较复杂,很有可能导致其他问题

比如imgowner不够明晰,出现多次对imgdelete,就可能导致crash。这也是为什么用c++实现的大型项目,内存管理是一个十分让人头疼的问题。针对每个指针,都要明晰它的owner并在不再使用时delete释放内存,小心再小心。

智能指针的出现给开发者带来了福音,用智能指针替换普通指针,开发者就不再需要手动释放内存了,也就不用担心忘记释放导致的内存泄漏,或者多次释放导致的crash问题了

PDFPage修改为使用智能指针,就能同时解决内存泄漏和可能存在的闪退问题

class PDFPage {
public:PDFPage(std::shared_ptr<QImage> _img);~PDFPage() = default;void paint();void addMark(std::shared_ptr<Mark> mark);// ...
private:std::shared_ptr<QImage> img;std::vector<std::shared_ptr<Mark>> marks;// ...
}

http://www.mrgr.cn/news/67257.html

相关文章:

  • A010-基于SpringBoot的宠物健康咨询系统的设计与实现
  • 推荐一款非常好用的C/C++在线编译器
  • 国标GB28181视频平台EasyCVR私有化视频平台工地防盗视频监控系统方案
  • Vue全局事件总线
  • 高效率的快捷回复软件 —— 客服宝聊天助手
  • AB 罗克韦尔模块 SD3K2004K
  • 【数据结构】插入排序——直接插入排序 和 希尔排序
  • 操作系统——作业、进程调度算法
  • 初识多线程
  • Linux 系统目录结构
  • 分布式中常见的问题及其解决办法
  • Go + Wasm
  • C#-类:静态成员的介绍
  • C++进阶-->红黑树的实现
  • ECCV2024新鲜出炉!动态再训练-更新用于无源目标检测的Mean Teacher
  • 真题--数组循环题目
  • 【找规律】
  • Prometheus启动参数配置及释义
  • 计算机视觉读书系列(1)——基本知识与深度学习基础
  • webworker
  • HJ48 从单向链表中删除指定值的节点
  • **AI的三大支柱:神经网络、大数据与GPU计算的崛起之路**
  • RHCE作业四
  • 实验7-3-4 字符串替换
  • 2024年11月7日 十二生肖 今日运势
  • 【前端】MQTT:通信与聊天室实战