首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一个内存泄露的有关问题,关于内存映射文件的

2012-02-04 
请教大家一个内存泄露的问题,关于内存映射文件的我对一个大数据量的位图创建了一个内存映射对象:FileSrc然

请教大家一个内存泄露的问题,关于内存映射文件的
我对一个大数据量的位图创建了一个内存映射对象: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、算法的实现尽量不要使用递归,可通过使用堆栈或队列的方法来消除递归

热点排行