捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
18 2018.02

GlobalAlloc

点击次数:1255 更新时间:2018/2/18 16:34:28  【打印此页

原文链接 -> 传送门

函数功能:

GlobalAlloc 函数用于从堆中分配指定大小的字节数。

注意:与其他内存管理函数相比,全部内存管理函数有更大的开销却提供更少的功能。除非指出使用全部内存管理函数,不然新的应用程序应该使用堆内存管理函数。更多信息请查阅 Global and Local Functions


API 函数原型:

注释:_In_ 说明该参数是输入的。

HGLOBAL WINAPI GlobalAlloc(
  _In_ UINT   uFlags,
  _In_ SIZE_T dwBytes
);


参数解析:
 

参数

含义

uFlags

1. 指定如何分配内存。若指定为 0,则是默认的 GMEM_FIXED

2. 此参数值可以是下面其中一个或几个(那些特别指明不兼容的组合除外):

含义

GHND
(0x0042)

GMEM_MOVEABLE 和 GMEM_ZEROINIT 的组合

GMEM_FIXED
(0x0000)

分配固定的内存,返回值是该内存对象指针

GMEM_MOVEABLE
(0x0002)

1. 分配可移动的内存,内存块在物理内存中是不可移动的,但在默认堆中可以移动

2. 返回值是该内存对象的句柄,可使用 GlobalLock 函数将该句柄转换为一个指针

3. 该值不能与 GMEM_FIXED 组合使用

GMEM_ZEROINI
(0x0040)

初始化所申请内存为 0

GPTR
(0x0040)

GMEM_FIXED 和 GMEM_ZEROINIT 组合


3. 以下标识已经过时,均被忽略。这些标识只是为与 16 位 Windows 相兼容而提供的:
 

·         GMEM_DDESHARE

·         GMEM_DISCARDABLE

·         GMEM_LOWER

·         GMEM_NOCOMPACT

·         GMEM_NODISCARD

·         GMEM_NOT_BANKED

·         GMEM_NOTIFY

·         GMEM_SHARE

dwBytes

1. 指定要申请的字节数

2. 若该参数为 0 且参数 uFlags 指定为 GMEM_MOVEABLE,则该函数返回一个内存对象的句柄,该内存对象被标记为可废弃的



返回值:

1. 如果函数调用成功,返回一个新分配的内存对象的句柄;

2. 如果函数调用失败,返回值为 NULL。

若想获得更多的错误信息,请调用 GetLastError 函数。


备注:

1. 内存管理器并不提供相互分开的局部堆和全局堆。因此,GlobalAlloc 函数和 LocalAlloc 函数本质上是相同的。

2. 使用 GHND 和 GMEM_MOVABLE 会添加不必要的开销,并且需要上锁才可以安全的使用。除非特别说明应该使用它们,否则应该避免使用。

3. 除非特别指出使用全局内存管理函数,不然新的应用程序应该使用堆内存管理函数。全局内存管理函数仍然使用动态数据交换(DDE),剪切板功能和对象链接嵌入(OLE)数据对象。

4. 如果 GlobalAlloc 函数调用成功,至少会分配用户请求的内存大小。如果实际分配的内存大小大于请求的内存大小,分配的内存都可以使用。使用 GlobalSize 函数获取实际分配的内存大小,单位为字节。

5. 如果堆内没有足够的空间满足请求,GlobalAlloc 函数将返回 NULL。因为 NULL 是用于标明错误,所以不会分配虚拟地址 0。因此很容易检测出是否在使用一个 NULL 指针。

6. 使用此函数分配内存可以保证分配的区域是 8 字节的整数倍。为了动态执行生成的代码,使用 VirtualAlloc 函数分配内存并使用 VirtualProtect 函数授予 PAGE_EXECUTE 访问权限。

7. 使用 GlobalFree 函数释放内存。使用 LocalFree 函数释放 GlobalAlloc 分配的内存并不是一个安全的做法。 


例子:

下边代码演示了 GlobalAlloc 函数和 GlobalFree 函数简单使用

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _cdecl main()
{
    PSECURITY_DESCRIPTOR pSD;

    pSD = (PSECURITY_DESCRIPTOR) GlobalAlloc(
           GMEM_FIXED,
           sizeof(PSECURITY_DESCRIPTOR));

    // Handle error condition
    if( pSD == NULL )
    {
       _tprintf(TEXT("GlobalAlloc failed (%d)\n"), GetLastError());
       return;
    }

    //see how much memory was allocated
    _tprintf(TEXT("GlobalAlloc allocated %d bytes\n"), GlobalSize(pSD));

    // Use the memory allocated

    // Free the memory when finished with it
    GlobalFree(pSD);
}



需求:
 

Minimum supported client

Windows xp [仅桌面应用程序]

Minimum supported server

Windows 2003 服务器版 [仅桌面应用程序]

Header

WinBase.h (包含于 Windows.h)

Library

Kernel32.lib

DLL

Kernel32.dll

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1255 更新时间:2018/2/18 16:34:28  【打印此页

上一条:MapViewOfFileEx

下一条:HeapAlloc

关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修