最近在做从相机采集图像到内存,再显示和保存的工作。用delphi编程,分配内存时采用Allocmem函数,如下:
Allocmem(P1,2048×1536×3);
Allocmem(P2,2048×1536);
Allocmem(P3,2048);Allocmem(P4,2048×1536×3);
Allocmem(P5,2048×1536);
Allocmem(P6,2048);
发觉只有Allocmem(P1,2048×1536×3)成功,而Allocmem(P4,2048×1536×3)没有成功,因而不能控制双相机,
这是怎么回事呢?请教高手!
而在C语言中采用类似的方法分配内存,就没有问题!这是由于Delphi与C语言机制不一样吗?
十分感谢!

解决方案 »

  1.   

    不知LZ使用的Allocmem是Delphi自身的,还是其它第三方提供的?如果是Delphi的,使用方法不正确,应该是:
    P1 := AllocMem(2048×1536×3);
      

  2.   

    Allocmem 是堆中申请空间因此有可能堆超出范围
    getmem是直接申请内存区域块应该没问题.
    freemem释放
      

  3.   

    刚查了下应该就是堆空间不足问题MS更新补丁描述:
    "应用安全更新 MS917422 之后,可能无法运行将应用程序大小限制为 2,048 字节的程序。出现此问题时,您不会收到任何错误消息。 "
      

  4.   

    allocmem和getmem功能基本相同,只不过allocmem把内存区置0,下面为ALLOCMEm的定义{ Memory management routines }function AllocMem(Size: Cardinal): Pointer;
    begin
      GetMem(Result, Size);
      FillChar(Result^, Size, 0);
    end;楼主可以
     try
      allocmem()
     except
      on  EOutOfMemory do
        showmessage('内存错误');
     end;
      

  5.   

    首先谢谢大家的关注!
    不好意思发贴时书写有个错误,应该是:
    P1:=Allocmem(2048×1536×3); 
    P2:=Allocmem(2048×1536); 
    P3:=Allocmem(2048); P4:=Allocmem(2048×1536×3); 
    P5:=Allocmem(2048×1536); 
    P6:=Allocmem(2048); 
    今天与高手交流了下,应该就是codegame大姐所说的问题。因为当调用P1、P2、P3组内存时没有错误,而调用
    P4、P5、P6时没能成功!要是堆空间不足,该如何处理呢!谢过大家先!
      

  6.   

    to 楼上:
    程序其它地方没有额外内存分配了,总是找不出原因!
    我采用allocmemsize(好像这样的有点记不住了)这个系统参数,查看了下,
    内存分配是成功的,总共有约25M左右的分配空间,但是调用的时候就不行了,只有第一组内存调用才能成功!
      

  7.   

    试试先!采用下面API函数调用第二组内存扫描行数显示为0,意即不成功!不知怎么回事!
    SetDIBitsToDevice(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
                              0, 0, 0, m_pBmpInfo^.bmiHeader.biHeight,
                              P4, m_pBmpInfo^, DIB_RGB_COLORS);
      

  8.   

    既然查看内存分配是成功的,而调用SetDIBitsToDevice不成功,说明问题不在内存分配上,其它方面都检查一下,思路放宽一点。
      

  9.   

    恩,不错,内存分配应该是成功的;
    今天我用allocmemsize和allocmemcount检查过了,
    内存分配是成功的,但是调用第二组失败!
    不知为何?快要疯了哦
    请大家帮我仔细看看!谢谢万分!
      

  10.   

    很正常啊。procedure TForm1.Button1Click(Sender: TObject);
    var
      P1, p2, p3, p4, p5: Pointer;
    begin
      Getmem(P1, 2048*1536*3);
      Getmem(P2, 2048*1536);
      Getmem(P3, 2048);  Getmem(P4, 2048*1536*3);
      Getmem(P5, 2048*1536);
      if Assigned(P1) then
        FreeMem(P1)
      else
        Caption := 'p1';  if Assigned(P2) then
        FreeMem(P2)
      else
        Caption := Caption + 'p2';
      if Assigned(P3) then
        FreeMem(P3)
      else
        Caption := Caption + 'p3';
      if Assigned(P4) then
        FreeMem(P4)
      else
        Caption := Caption + 'p2';  if Assigned(P5) then
        FreeMem(P5)
      else
        Caption := Caption + 'p5';
    end;