测试环境: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诊断工具,堆分析,截取快照查看内存使用率;两次实验,均为新建工程;