跳转至内容

C 编程/MS Windows 参考/alloc.h

来自维基教科书,开放书籍,造福世界

"alloc.h" 是一个非标准的头文件。它不是 ANSI 标准的一部分,因此不是 ANSI C 头文件,但存在于许多 C 语言方言中。它可用于 Borland Turbo C TIGCC。此头文件提供了关于动态内存分配的操作。此头文件包含 "内存管理" 函数。

示例用法

[编辑 | 编辑源代码]

要使用 alloc.h 中的函数,我们必须在使用它们之前包含 alloc.h

#include <stdio.h>
#include <alloc.h>

int main()
{
     int *ptr;
     
     ptr = (int *) alloca (sizeof(int));
     scanf("%d", ptr);
     printf("%d is stored dynamically.\n", *ptr);

     return 0;
}
函数声明 函数目的
void *alloca (unsigned long Size); 在堆栈内存上分配存储空间。
void *calloc (unsigned short NoOfItems, unsigned short SizeOfItems); 从内存堆中为给定数量的元素分配内存存储空间。为变量设置的空间的值将自动初始化为零。
void *calloc_throw (unsigned short NoOfItems, unsigned short SizeOfItems); 调用 calloc 并如果内存不可用则抛出错误。否则返回 calloc 返回的地址。
void *malloc (unsigned long Size); 它在内存堆中分配 "Size" 字节内存。它在失败时返回 NULL。此内存块可以通过 free 函数释放。
void *malloc_throw (unsigned long Size); 调用 malloc 并如果内存不可用则抛出错误。否则返回 malloc 返回的地址。
void *realloc (void *Ptr, unsigned long NewSize); 重新分配以前由 *Ptr 分配的内存块。它返回重新分配的内存块的地址,该地址可能与 Ptr 不同。它在失败时返回 NULL。
void *realloc_throw (void *Ptr, unsigned long NewSize); 调用 realloc 并如果内存不可用则抛出错误。否则返回 realloc 返回的地址。
void free (void *Ptr); 直接到控制台释放由 malloccalloc 分配的内存。

堆内存分配函数

[编辑 | 编辑源代码]
函数声明 函数目的
HANDLE HeapAlloc (unsigned long Size); 它分配 Size 字节的内存堆并返回句柄。Size 被视为偶数。奇数大小向上取整。分配的内存保存在单链表结构中。最大大小为 65520 字节,最小大小为 6 字节。它在失败时返回 H_NULL。
HANDLE HeapAllocThrow (unsigned long Size); 它调用 HeapAlloc 函数并返回相应的句柄。它在失败时抛出错误。
HANDLE HeapAllocESTACK (unsigned long Size); 如果 "Size" 字节内存不可用,则它会截断表达式堆栈。即使在减少堆栈内存后仍然不可用,它也会返回 H_NULL。
HANDLE HeapAllocHigh (unsigned long Size); 它在内存堆的高端分配内存并返回句柄。它将所有已用内存块向下移动到堆中。如果内存不可用,它将返回 H_NULL。
HANDLE HeapAllocHighThrow (unsigned long Size); 它调用 HeapAllocHigh 函数并返回句柄。在失败时,它会抛出内存错误。
void *HeapDeref (HANDLE Handle); 它对句柄进行反引用并返回内存地址。要使用由句柄保留的内存,必须对句柄进行反引用。
void HeapFree (HANDLE Handle); 它释放由句柄分配的内存。
void HeapFreeIndir (HANDLE *HandlePtr); 它释放与传递的句柄关联的内存块并将句柄设置为 NULL。
void *HeapAllocPtr (unsigned long Size); 它非常类似于 HeapAllocHigh。它做同样的事情。但它不是返回句柄,而是返回指向分配块的指针。它在失败时返回 NULL。
void *HeapAllocPtrThrow (unsigned long Size); 它调用 HeapAllocPtr 并返回相应的指针。它在失败时抛出错误。
void HeapFreePtr (void *Ptr); 它释放由 HeapAllocPtr 分配的内存块。

杂项函数

[编辑 | 编辑源代码]
函数声明 函数目的
unsigned long HeapAvail (void); 它返回内存堆中可用的总字节数。
void HeapCompress (void); 它压缩所有分配的堆内存块。如果可能,它会删除空闲内存块。此函数通常在必要时在内部调用。
void *HeapEnd (void); 它返回指向内存堆末端的指针。
HANDLE HeapLock (HANDLE Handle); 它锁定由句柄分配的内存块。它在成功时返回相同的句柄,否则返回 H_NULL。锁定确保在内存堆重新排列期间不会移动或删除内存块。
short HeapGetLock (HANDLE Handle); 它确定传递的句柄是否已锁定。如果块未锁定,则返回 0。
void *HLock (HANDLE Handle); 它锁定并反引用由句柄保留的内存块。
unsigned long HeapMax (void); 它返回可以保留的内存块的最大大小。
成员常量 描述
H_NULL 它被称为空句柄。它定义为零值。
NULL 它是一个空指针。它指向地址 0。

预定义类型

[编辑 | 编辑源代码]
  • Bool
enum Bool {FALSE, TRUE};

它是一个枚举。它定义了两个二进制值 false 和 true。常量 FALSE 代表逻辑 0,而常量 TRUE 代表逻辑 1。

  • HANDLE
 typedef unsigned short HANDLE;

句柄代表一个已分配的对齐的内存块。它的地址可以通过 alloc.h 中的 HeapDeref 函数检索。HANDLE 用于管理由 alloc.h 函数分配的内存。其他头文件中的某些函数使用 HANDLE 作为参数。

偏离标准

[编辑 | 编辑源代码]
此图像显示了 malloc 和 HeapAlloc 之间的重大区别
  • alloca 函数与标准 malloc 函数不同,malloc 在内存堆中分配内存,而 alloca 在堆栈内存中分配内存。因此,此存储是本地的。在函数中,如果使用 alloca 分配内存,则它会在函数结束时自动释放。 alloca 更适合需要本地动态内存分配的应用程序。
  • malloc 以线性顺序分配给定的字节块。它需要连续的内存块。HeapAlloc 分配存储在链表结构中的内存。它是有利的。
  • 许多时候,内存块是保留的。长时间锁定的内存块应该移动到堆中较高的位置。这减少了这些块与系统其余部分的干扰。这可以通过使用 HeapAllocHigh 函数来实现。这会在请求内存分配之前重新排列堆。
  • 当我们调用 malloc 时,内存管理器会为分配的块分配一个称为句柄的指针。为每个块分配句柄。因此,当我们要使用大量小尺寸的内存块时,malloc 效率不高。由于大量句柄,处理变得很困难。因此,alloca 是这种情况下的更好选择。
  • "alloc.h" 中的 HeapRealloc 函数与 realloc 类似。在 HeapRealloc 的情况下,如果重新分配失败,它会释放先前分配的内存。通常,realloc 会保持先前分配的内存块完好无损。

参考文献

[编辑 | 编辑源代码]
华夏公益教科书