关于IMAGE类创建对象内存释放问题

0

测试环境:EasyX Library for C++ (Ver:20220901) & vs2017 & 使用 Unicode 字符集

问题:局部对象出作用域后内存没有完全释放,不清楚原因

测试代码如下

#include <iostream>
#include "graphics.h"

//vs2017   Unicode编码   EasyX Library for C++ (Ver:20220901)

void TestReleaseImage()
{
	IMAGE img(1920, 1080);
	SetWorkingImage(&img);
}

int main()
{
	for (int i = 0; i < 20; i++)
	{
		TestReleaseImage();
	}

	return 1;
}

查看堆栈内存分析

ID	时间		分配(差异)	堆大小(差异)
1	0.03秒	0(+0)		0.00 KB (+0.00 KB)   // 进去main函数,for之前截取快照
2	0.04秒	165(+165)	43.13 KB (+43.13 KB) // 第一次进入TestReleaseImage函数,构造初始化完IMAGE,SetWorkingImage后
3	0.04秒	169(+4)  	43.52 KB (+0.39 KB)  // 退出TestReleaseImage函数
4	0.05秒	301(+132)   51.07 KB (+7.55 KB)  // 第二次执行完TestReleaseImage并退出
5	0.05秒	300(-1)		52.28 KB (+1.21 KB)  // 第三次执行完TestReleaseImage并退出
6	0.06秒	299(-1)		50.62 KB (-1.66 KB)  // 第四次执行完TestReleaseImage并退出
7	0.06秒	297(-2)	    50.05 KB (-0.56 KB)	 // 第五次执行完TestReleaseImage并退出
8	0.06秒	297(+0)  	50.05 KB (+0.00 KB)	 // 第六次执行完TestReleaseImage并退出
9	0.06秒	297(+0)		50.05 KB (+0.00 KB)   // 第七次执行完TestReleaseImage并退出,之后知道20次循环结束保持不变
10	0.09秒	297(+0)		50.05 KB (+0.00 KB)   // 运行到return 1;
11	0.09秒	297(+0)		50.05 KB (+0.00 KB)   // return 之后

对照测试

#include <iostream>
#include <vector>
#include <string>
//vs2017  使用 Unicode 字符集

void TestReleaseSTL()
{
	std::string str("helloworld");
	std::vector<std::string> vec_str = { {"This"}, {"is"}, {"STL"}, {"test"}, {"string"} };
}

int main()
{
	for (int i = 0; i < 20; i++)
	{
		TestReleaseSTL();
	}
	return 1;
}

查看堆栈内存分析

ID	时间		分配(差异)	堆大小(差异)
1	0.03秒	0(+0)		0.00 KB (+0.00 KB)  // 进去main函数,for之前截取快照
2	0.04秒	8(+8)	    0.47 KB (+0.47 KB)	// 进入TestReleaseSTL函数,构造初始化完string与vector<string>后
3	0.05秒	0(-8)  	    0.00 KB (-0.47 KB)	// 退出TestReleaseSTL函数
4	0.05秒	0(+0)		0.00 KB (+0.00 KB)  // 运行到return 1
5	0.08秒	0(+0)		0.00 KB (+0.00 KB)  // return 结束

测试数据来源于VS诊断工具,堆分析,截取快照查看内存使用率;两次实验,均为新建工程;

ava
八至

2022-12-12

0

处理 IMAGE 对象的代码会在第一个 IMAGE 对象创建的时候初始化,但是 IMAGE 对象析构之后并不会清理相关初始化。

当第二次创建 IMAGE 对象的时候,可以加快速度。

你可以验证下, 创建局部 IMAGE 对象 100 次,所占用的内存并不会提升 100 倍。所以,这并不是 IMAGE 对象的内存泄漏。

ava
慢羊羊

2022-12-12

技术讨论社区