C 编程/MS Windows 参考/alloc.h
外观
< C 编程 | MS Windows 参考
"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); |
直接到控制台释放由 malloc 或 calloc 分配的内存。 |
函数声明 | 函数目的 |
---|---|
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 作为参数。
- alloca 函数与标准
malloc
函数不同,malloc 在内存堆中分配内存,而alloca
在堆栈内存中分配内存。因此,此存储是本地的。在函数中,如果使用alloca
分配内存,则它会在函数结束时自动释放。alloca
更适合需要本地动态内存分配的应用程序。
malloc
以线性顺序分配给定的字节块。它需要连续的内存块。HeapAlloc
分配存储在链表结构中的内存。它是有利的。
- 许多时候,内存块是保留的。长时间锁定的内存块应该移动到堆中较高的位置。这减少了这些块与系统其余部分的干扰。这可以通过使用
HeapAllocHigh
函数来实现。这会在请求内存分配之前重新排列堆。
- 当我们调用
malloc
时,内存管理器会为分配的块分配一个称为句柄的指针。为每个块分配句柄。因此,当我们要使用大量小尺寸的内存块时,malloc
效率不高。由于大量句柄,处理变得很困难。因此,alloca
是这种情况下的更好选择。
- "alloc.h" 中的
HeapRealloc
函数与 realloc 类似。在HeapRealloc
的情况下,如果重新分配失败,它会释放先前分配的内存。通常,realloc 会保持先前分配的内存块完好无损。