程序流程大致如下:
1.执行程序定义一个静态数据,初始化往里面放入数据
2.执行程序将这个数组的地址传给dll,然后dll也有一个线程,不定时从这个静态数组copy数据到dll中开辟的空间中。copy完后给执行程序发一个线程消息,线程收到消息后就往数组放数据。
3.执行程序也开一个线程,(专门负责往这个数组放数据,)当线程收到一个线程消息,就往这个指定的静态数组放数据;现在出现一个问题:
 
  在用任务管理器查看执行程序时,内存使用 和 虚拟内存使用 在不断增加,但我关掉执行程序时 debug模式下又没有监视到内存泄漏。。我想知道为什么 内存使用会一直增加???

解决方案 »

  1.   

    很正常的生产者消费者问题。检查所有分配的代码是否没有正确释放。或者借助如BoundsChecker这样的工具。
      

  2.   

    0.
    在用任务管理器查看执行程序时,内存使用 和 虚拟内存使用 在不断增加
    ---
    一直增加呢还是增加到一定程度就不变了?刚开始的时候有增加正常.1. 静态数组本身不会引起内存泄露2. 
    debug模式下又没有监视到内存泄漏
    ---------------
    你是在调试模式下么? 如果源代码都在工程中(没有使用第三方库), debug 调试模式下没有监视到内存泄漏一般就不会有泄露3.
    dll也有一个线程,不定时从这个静态数组copy数据到dll中开辟的空间中
    -----
    copy的时候有没有分配内存, 主要还是检测一下其他地面有没有泄露的可能
      

  3.   

    回楼上两位: 1.主程序线程是静态的数组,dll中也是静态的数组来接收数据。即没有new新的空间
     2.debug模式下没有内存泄漏
     3.内存是一直增加,但我调用程序中的中止函数时,这些增加的内存会一次减少到程序启动状态
     我是用DirectSound在做边下载边播放,所以需要主线程不断给我数据解码,整个过程我都是用的unsigned char[INBUFF],没有new。主线程是把这个静态缓冲区地址传给dll,然后dll 每次需要数据时从这个地址copy到dll的缓冲区(静态分配)解码。
    (然后循环覆盖这个缓冲区)
      
      

  4.   

    你可以先试试在dll中把DirectSound解码的代码先屏蔽,看看还有没有泄露
    ==>
    是不是DirectSound解码部分的问题
      

  5.   

    我等下尝试你的。关于DSound 还有一个很奇怪的,当我在主程序线程里面判断如果我放入的数据已经达到了歌曲文件的长度(这里是模拟网络数据一段一段的播放),那么我就不往这个数组放入数据而是值空,结果 我在调试时,歌曲才放到三分之一文件长度时,文件就已经被读到尾部了,接下来数组全是0,但我把这个0的数组数据继续copy到解码器中,歌曲还能正常播放完毕。崩溃了。不理解为什么我都没放数据了,DS缓冲区还能播放,不知道这是不是DSound 缓冲区是怎么保存
      

  6.   

    DSound 本身有个事件通知机制,如果我屏蔽掉解码部分,那么缓冲区没有数据可以播放,DSound缓冲区事件通知机制不会被激活,dll 加载数据线程就挂住了。不知道你有没有用mpg123解码器解码MP3的,这个播本地文件是很正常的,就是播一段一段的数据时,出现这种内存不断增加的问题,还有就是,歌曲还没播完,文件就被读完了,诡异的是文件读完了,歌曲还能继续正常播放结束
      

  7.   

    刚按照你的方式测试了一下,可能就是解码器的问题,难道mpg123解码器内部会自动增加空间来存放解码的数据?
      

  8.   

    楼主应该自己先分析一下,定位出具体哪一块出了问题,然后可以贴出部分的代码进行分析,用VLD.dll添加进去,可以跟踪一下简单的内存增加地址,或者用微软的UMDH工具,可以跟踪到堆栈