请教大家一个内存泄露的问题,关于内存映射文件的
我对一个大数据量的位图创建了一个内存映射对象:FileSrc
然后创建一个内存映射对象:FileObj
保存从位图里每四个像素读取一个像素,也就是隔行读取,在同一行里隔一个像素读取一个。
for (int k = 0;k <iPHeight;++k)
{
//每行数据隔一个像素拷贝一个
BYTE* Obj=FileObj.GetMapAddress();............a
BYTE* Src=FileSrc.GetMapAddress();
for(int s = 0; s <iPWidth;++s).................b
{
memcpy(Obj+s,Src+2*s,1);
}...........................................c
FileObj.MoveMapAddress(iPWidth);
FileSrc.MoveMapAddress(2*iWidth);...........d
}
现在的情况是:循环的时候
1.从a到b内存占用会增长4k
2.从b到c内存占用会增长16k
3.从c到d不回增长
下面是GetMapAddress()和MoveMapAddress()函数的代码:
//获得内存映射指针
BYTE* GetMapAddress()
{
return lpMapAddress;.............内存映射返回的地址
};
//移动内存映射的指针,我的理解是内存映射的内存是一页一页的
//当你想要访问的指针不在当前映射的页面时就会引起页面异常,然后读取
//想要的页面,我的目的是当读取当前前行的时候,就把指针移动到该行的
//开始位置,而不是总停留在整个位图数据开始的地方,指针每次移动的距离就近
//一点,程序就会快一点点,不知道这样理解对不对,请各位赐教。
BYTE* MoveMapAddress(int MoveSize)
{
lpMapAddress+=MoveSize;
return lpMapAddress;
};
现在要问问题是:
1.BYTE* Obj
BYTE* Src 这两个指针是会自动销毁的吧?
2.为什么在我GetMapAddress()是会有内存的增长?我觉得是Obj和Src两个指针不能
自动销毁
3.为什么memcpy时也会有内存增长呢?
4.因为我创建这两个内存映射对象是放在递归函数里的,所有在函数返回前不会释放这两个内存映射对象。
麻烦大家了,谢谢!!
[解决办法]
在使用了函数 MapViewOfFile()之后,必须要有对应的UnmapViewOfFile()调用,否则在进程终止之前,保留的区域将无法释放。除此之外,前面还曾由CreateFile()和CreateFileMapping()函数创建过文件内核对象和文件映射内核对象,在进程终止之前有必要通过 CloseHandle()将其释放,否则将会出现资源泄漏的问题
[解决办法]
1、递归函数中,声明FileSrc和FileObj时是否加上了static?
2、memcpy(Obj+s,Src+2*s,1); 没有必要,可直接写成obj[s]=src[s < <1];
3、应UnmapViewOfFile后再 CloseHandle(hMapFile);
4、算法的实现尽量不要使用递归,可通过使用堆栈或队列的方法来消除递归