2 pckr315 pckr315 于 2016.02.29 08:46 提问

共享内存 内存泄露问题

我用的是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
hikarisamax   2016.02.29 17:15

不妨

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

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
性能指标之资源指标-内存-是否有内存泄漏(2)
进程使用的共享内存段 除了Data Segment可以造成内存泄露,如果进程分配共享内存,也可能造成内存泄露。 共享内存是某个进程分配,其他进程可以访问的内存段,共享内存会映射到每个进程的地址空间。那么如何查看指定进程消耗的共享内存呢? 首先,还是要介绍概念,共享内存在AIX上可能有两种内存段:shared memory segment和mem
共享内存删除的安全“陷阱”
共享内存就是使多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理
Flex内存泄露问题
Flex内存泄露问题Flex内存泄露问题Flex内存泄露问题
ngx 全局变量共享内存
全局变量用法             ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_limit_req_ctx_t));             if (ctx == NULL) {                 return NGX_CONF_ERROR;             }             ctx->inde
Linux共享内存常见问题分析
前言 这个是接上篇,本来是记录在一篇草稿上的,但是,内容根本不相关,排版怎么都觉得不好看,也不方便以后查阅。干脆再起一篇。 System V 共享内存问题 shmget创建共享内存问题 shmget函数用来创建一个新的,或者访问一个已存在的共享内存区。 #include #include int shmget(key_t key, size_t size, int
javascript内存泄露问题的解析
javascript内存泄露问题的解析 javascript内存泄露问题的解析javascript内存泄露问题的解析
生产者进程和消费者进程共享内存解决方法---循环数组
生产者进程和消费者进程共享内存解决方法---循环数组
共享内存应用中的问题及解决方法
System V 进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。消息队列和信号量均是内核空间的系统对象,经由它们的数据需要在内核和用户空间进行额外的数据拷贝;而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。System V 为共享内存定义了下列API接口函数:
用共享内存实现生产者和消费者
1、shm_com.h #include #include #define SHM_BUF_SIZE 2048 struct shm_buf {     int num;     char buf[SHM_BUF_SIZE]; }; 2、sem_com.h #include #include #include #include #include u
System V共享内存与信号量综合应用之生产者与消费者问题解决
一.生产者---消费者问题 有一个仓库(缓冲区),生产者生产出来的东西往里面扔,消费者从里面取东西。如何安排能够使两者之间不冲突。 一些基本的约束条件:     1.仓库只有一个,且有固定大小。生产者有多个消费者有多个     2.生产者占用仓库前要判断仓库是否满,满了就不能争用     3.消费者使用仓库前要判断仓库是否空,空了就不能争用     4.仓库中要么只有消费者要么