最近用DELPHI7写了一个程序,里面有不少内存操作.
结果测试时发现:在单核心的CPU上,运行稳定,在普通的双核机器上,内存就出现严重泄露问题.
请高手指点一二.先行谢过了!紧急.

解决方案 »

  1.   

    是的!
    很多线程,有WINDOWS API级别的内存分配与释放.
      

  2.   

    分配和释放是在同一个线程里面进行的!应该不会出现那样的关系.
    弄不明白,为啥跟CPU有关系了.
      

  3.   

    原因就是没做好同步工作,不同的core使用不同的cache,在读写内存的时候cpu会先往cache上写东西,然后再更新内存中的内容
    这就没人能帮你了,你的代码中有问题的地方可能太多了
      

  4.   

    1 这里面没有要同步的东西,内存操作都是独立在单个线程内部.一个执行体!
    2 如果问题很多,单核下运行为什么又没有问题呢?
    主代码如下:
    while not bRequestExit do
        begin
          Sleep(20);
          try
            if not  idtcpclnt.Connected then
               Continue;
            SetLength(bbuf,0);
            idtcpclnt.IOHandler.ReadBytes(bbuf,SizeOf(VideoPack));
            BytesToRaw(bbuf,VideoPack,SizeOf(VideoPack));
            SetLength(bbuf,0);
            idtcpclnt.IOHandler.ReadBytes(bbuf,VideoPack.Videodata.VideoSize);
            BytesToRaw(bbuf,frame_buf,VideoPack.Videodata.VideoSize);
            Size := VideoPack.Videodata.VideoSize;
            disp_buffer := Pointer(GlobalAlloc( GMEM_FIXED  or GMEM_ZEROINIT ,Size));
            try
             if convert.Decode(disp_buffer,Integer(PIX_FMT_BGR24),frame_buf,size) then
             begin
                Self.DisplayVideo(disp_buffer);//就是这个函数内部运行有问题
             end;
           finally
              GlobalFree(DWord(disp_buffer));
              Freeandnil(VideoPack);
           end;
          except on e:exception do
          end;
        end;
      

  5.   

    那你还是好好补补基础去吧
    或者你可以发表一篇论文颠覆人们以往对多核cpu的认识:我写了一个线程安全的程序,同步绝对没问题,只是在双核的机器上出毛病,所以双核的cpu都是有问题的
      

  6.   

    试一下在最开始增加
    IsMultiThread := True;
      

  7.   

    我还碰到一个更邪门的问题,在2003下没问题,,在虚拟机下的xp 2003也没问题,但在虚拟机下的vista就内存泄漏,执行一次,内存增加4字节,代码如下:
    AnsiString test(void)
    {
        AnsiString a = "1";
        return a;
    }
      

  8.   

    多线程一定会有同步么????
    我这里的多线程只是有多个任务要处理,加强界面显示而已.
    这个根本就没有同步!
    @Seamour
    还是谢谢你的提醒吧,最少你在关注我的问题.
      

  9.   

    问题基本解决,确认了原因了!在显示视频的时候使用了一个COPY,
    vdwndw.Canvas.CopyRect(rect2,SpBmp.Canvas,rect1);
    //vdwndw:TVideoWindow
    这种模式下,在单核CPU上能安全释放掉使用的内存,但双核心上则不能.
    感谢楼上各位了