pckr315 2016-02-29 00:46 采纳率: 0%
浏览 2091

共享内存 内存泄露问题

我用的是dll, 一个进程WriteFileMap写入,另一个进程ReadFileMap,WriteFileMap每写入一次内存就增加大概1兆,知道报错〖8〗-存储空间不足,无法处理此命令。求大神,是不是哪里写的有问题
MT4_EXPFUNC wchar_t* __stdcall WriteFileMap(const wchar_t *strdat,const int anumber)
{

    char DataBuf[983040];
    char cnumber[20];
    char error[10];
    itoa(anumber,cnumber,sizeof(cnumber));
    w2c(strdat,DataBuf,sizeof(DataBuf));

    //if(!MapWriteing && !MapReading)
            m_WriteMap = OpenFileMapping(FILE_MAP_WRITE, FALSE, LPCTSTR(cnumber));
        if (m_WriteMap == NULL) 
            m_WriteMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 983040,  LPCTSTR(cnumber));
        //  m_WriteMap = CreateFileMapping(0xFFFFFFFFFFFFFFFF, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 983040,  LPCTSTR(cnumber));
        if (m_WriteMap == NULL) 
            {
                    _ultoa( GetLastError(), error, 10 );
                    MapWriteing=0;
                    return(c2w(error));
            }
            m_lpWriteBuf = (LPBYTE)MapViewOfFile(m_WriteMap, FILE_MAP_WRITE, 0, 0, 0);
            if (m_lpWriteBuf == NULL)
                {
                    CloseHandle(m_WriteMap);
                    m_WriteMap = NULL;
                    _ultoa( GetLastError(), error, 10 );
                    MapWriteing=0;
                    return(c2w(error));
                }
            else
                memcpy(m_lpWriteBuf,DataBuf,sizeof(DataBuf));
        // 不需要内存映射的时候要关闭,两边都需要关闭内存映射文件

        if (m_WriteMap != NULL)
        {
        UnmapViewOfFile(m_WriteMap);
        m_WriteMap = NULL;
        }   
            if (m_lpWriteBuf != NULL)
        {
        CloseHandle(m_lpWriteBuf);
        m_lpWriteBuf = NULL;
        }

        return(c2w("1"));       
}    

//宿主进程读取共享数据;
MT4_EXPFUNC wchar_t* __stdcall ReadFileMap(const int anumber)
{

char DataBuf[983040];
char cnumber[20];
char error[10];
itoa(anumber,cnumber,sizeof(cnumber));

        m_ReadMap = OpenFileMapping(FILE_MAP_READ, FALSE, LPCTSTR(cnumber));
        //m_ReadMap = OpenFileMapping(FILE_MAP_READ, FALSE, "1634061");
        if (m_ReadMap == NULL) 
            {
            _ultoa( GetLastError(), error, 10 );
            MapReading=0;
            return(c2w(cnumber));
        //  return(c2w("err1"));
            }
        m_lpReadBuf = (LPBYTE)MapViewOfFile(m_ReadMap,FILE_MAP_READ,0,0,0);
        if (m_lpReadBuf == NULL)
        {
            CloseHandle(m_ReadMap);
            m_ReadMap=NULL;
            _ultoa( GetLastError(), error, 10 );
            MapReading=0;
            return(c2w(error));
        //  return(c2w("err2"));
        }
        else
            memcpy(DataBuf,m_lpReadBuf,sizeof(DataBuf));

            // 不需要内存映射的时候要关闭,两边都需要关闭内存映射文件
            if (m_lpReadBuf != NULL)
            {
            UnmapViewOfFile(m_lpReadBuf);
            m_lpReadBuf = NULL;
            }       /*
            if (m_ReadMap != NULL)
            {
            CloseHandle(m_ReadMap);
            m_ReadMap = NULL;
            }
            MapReading=0;*/
        //  return(c2w("err3"));
            return(c2w(DataBuf));

}

  • 写回答

1条回答 默认 最新

  • hikarisamax 2016-02-29 09:15
    关注

    不妨

    char DataBuf[983040] 改为 char* DataBuf = new char[983040];
    返回处别忘了delete[] DataBuf;

    在代码段用硬代码分配大长度的字符数组是很危险的,很容易泄露内存地址.

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算