此处所列的文章均是我自己从国外的网站摘抄并翻译的,由于英文水平有限,里面肯定有不少错漏.翻译这些东西没有其他的什么用途,只是提高自己的英语阅读能力和编程技术水平而已     

Delphi中堆的使用

The GlobalAlloc function allocates the specified number of bytes from the heap. In the linear Win32 API environment, there is no difference between the local heap and the global heap.

HGLOBAL GlobalAlloc(

    UINT uFlags, // object allocation attributes
    DWORD dwBytes  // number of bytes to allocate 
   );

Return Values

If the function succeeds, the return value is the handle of the newly allocated memory object.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.

If this function succeeds, it allocates at least the amount of memory requested. If the actual amount allocated is greater than the amount requested, the process can use the entire amount. To determine the actual number of bytes allocated, use the GlobalSize function.

调用GlobalAlloc函数分配一块内存,该函数会返回分配的内存句柄。
调用GlobalLock函数锁定内存块,该函数接受一个内存句柄作为参数,然后返回一个指向被锁定的内存块的指针。您可以用该指针来读写内存。
调用GlobalUnlock函数来解锁先前被锁定的内存,该函数使得指向内存块的指针无效。
调用GlobalFree函数来释放内存块。您必须传给该函数一个内存句柄。

GlobalAlloc
说明
分配一个全局内存块
返回值
Long,返回全局内存句柄。零表示失败。会设置GetLastError
参数表
参数 类型及说明
wFlags Long,对分配的内存类型进行定义的常数标志,如下所示:
             GMEM_FIXED 分配一个固定内存块
             GMEM_MOVEABLE 分配一个可移动内存块
             GMEM_DISCARDABLE 分配一个可丢弃内存块
             GMEM_NOCOMPACT 堆在这个函数调用期间不进行累积
             GMEM_NODISCARD 函数调用期间不丢弃任何内存块
             GMEM_ZEROINIT 新分配的内存块全部初始化成零
dwBytes Long,要分配的字符数
注解 
如指定了 GMEM_FIXED,那么返回值就是要使用的实际内存地址即指针(GlobalLock 会返回同样的值)——所以在使用固定内存块的时候不需要执行一个 GlobalLock/GlobalUnlock 操作
由于 Win32 采用了高级的内存管理方案,所以使用可移动的内存块并没有什么好处
用这个函数分配的内存块允许在8位边界以内
【附】关于GlobalAlloc的问题
--------------------------------------------------------------------------------
问:在使用 GlobalAlloc 分配一个全局内存块时,使用GMEM_FIXED分配一个固定内存块与使用GMEM_MOVEABLE分配一个可移动内存块到底有什么不同?(请 具 体 点)
其效率上是否也存在差异?
为什么在有些源码中,再使用GMEM_MOVEABLE标志分配内存时,将使用GlobalFree对其返回的内存句柄进行释放操作的语句注释掉,或者干脆就不写?难道是不需要这么做吗?
--------------------------------------------------------------------------------
答:GMEM_MOVEABLE是允许操作系统(或者应用程序)实施对内存堆的管理,在必要时,操作系统可以移动内存块获取更大的块,或者合并一些空闲的内存块,也称“垃圾回收”,它可以提高内存的利用率。一般情况下,内存堆空间是由用户来管理的,windows操作系统不干预。如果存在下列情况,即堆中有10个1K的空闲块,这时如果直接申请一个5K的内存空间,会得到不成功的信息。但如果其它已经被占用的内存块是movable,这时系统就可以移动这些内存块,合并出一个5k的内存块,并成功分配给用户使用。它的空间效率是以运行时的时间效率为代价的。

 

procedure TForm1.Button2Click(Sender: TObject);
var
  hHeap: THandle;
  iSize, i: Integer;
  Ps: Pchar;
begin
  hHeap := GlobalAlloc(GMEM_MOVEABLE, 1000);
  self.Edit1.Text := IntToStr(hHeap);
  iSize := GlobalSize(hHeap);
  caption := IntToStr(iSize);
  Ps := GlobalLock(hHeap);
  for i := 0 to 1000 do
  Begin
    ps[i] := '1';
  end;
  ShowMessage(ps);
  GlobalUnlock(hHeap);
  GlobalFree(hHeap);
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  Ps: Pchar;
begin
  Ps := GlobalLock(StrToIntdef(self.Edit1.Text, 0));
  ShowMessage(Ps);
end;

 

http://www.openroad.org/school/gui/winmem.html

posted @ 2010-11-14 21:32  AppleAndPear  阅读(462)  评论(0编辑  收藏  举报