有一个这样的程序
struct STRUCT1{
....
};
线程函数:
UINT thread1(LPVOID parameter){
  STRUCT1 *stru=(STRUCT1 *)parameter;
  ....
  delete stru;
  return 0;
}
主函数:
int main(){
  STRUCT1 *stru;
  ......
  while(1){
    if(....){
      stru=new STRUCT1;
      AfxBeginThread(thread1,stru);
    }
    Sleep(2000);
  }
  return 0;
}程序运行一段时间后发现使用的内存不断地变化,但是最终都是一直往上增长的,但是可以肯定所有线程都正确的退出了,而且delete stru;语句也的确有执行。
问题出现在哪边呢?
分不够可以加

解决方案 »

  1.   

    定义全局变量
    LONG numOfStru = 0;在stru=new STRUCT1;
    后面加1行InterlockedIncrement ( &numOfStru );在线程里面delete STRUCTl前面加一行
    InterlockedDecrement ( &numOfStru );然后随时关注 numOfStru的数量就知道问题出在哪里了
      

  2.   

    还有个办法VC Debug模式运行程序退出以后会自动帮你检测是否存在内存泄漏
      

  3.   

    to  fantiyu(fantiyu):
    因为线程的最后一句语句都执行了,所以可以肯定delete是肯定有执行的(它后面的语句执行了),现在的问题是似乎没效果,不知道引起内存占用不断增加是否是由其它原因引起,程序里面除了主线程与几个thread1外没有其它thread。
      

  4.   

    怀疑是因为忘了关闭线程句柄,改成这样子:
    DWORD WINAPI thread1(LPVOID parameter){
      STRUCT1 *stru=(STRUCT1 *)parameter;
      ....
      delete stru;
      return 0;
    }启动线程时
    HANDLE handle=CreateThread(0,0,thread1,stru,0,&tid);
    CloseHandle(handle);结果还是一样。
    到底有没有人碰到过这样的问题呀
      

  5.   

    我怀疑你的数据结构有问题。
    struct STRUCT1{
    ....
    };
    如果在里面有指针,这个指针又指向一块内存,如果不释放的话,就有内存泄漏。
    你在debug模式下运行一次。
    看看有没有内存泄漏,
    如果有可以看出是在哪个文件的哪行导致了内存泄漏
      

  6.   

    奇怪的是在debug模式下没报告内存泄漏,整个程序内部除了main里面有分配内存外其他地方都没有分配,所以才特别奇怪。有没有其他情况会导致占用的内存不断增加呢?
      

  7.   

    如果debug没报告内存泄漏你这种情况只能说明线程数不断增加
    或者系统堆栈不断增加
      

  8.   

    可能是AfxBeginThread(thread1,stru);一直运行好多次
    而UINT thread1(LPVOID parameter)这个线程函数结束的次数少
    之间就有一个差值,你不断增加线程,而其中某些线程并没有结束呢,
    他们最终会结束,但在结束前已经又调用了AfxBeginThread(thread1,stru);
      

  9.   

    to  fantiyu(fantiyu):
    系统堆栈不断增加是什么意思呢?
    线程数肯定没有不断增加的,因为程序里做了一个计数器,对活动线程进行计数,可以看出线程在通常情况下都是0个(除了主线程)
      

  10.   

    终于找到原因了,有些句柄没有release。谢谢大家。散分