1、打开VS2017,新建一个名为“MemoryMgtDemo2”的“Windows控制台应用程序”项目(详细步骤请参考引用文章);
2、在VS2017打开的“MemoryMgtDemo2.cpp”文件中,添加“查询默认岜躲怡镌堆信息”的测试代码,然后调试运行程序。在新添加的代码中,通过HeapQueryInformatica函数查询调用进程默认堆上的兼容信息(即HeapCompatibilityInformation类别,返回结果保存到ULONG变量中),然后根据查询结果打印对应的中文提示信息(详情请参考HeapQueryInformation函数的MSDN说明);
3、在弹出的控制台窗口中,可以根据输出内容确认控制台进程的默认堆为一个低碎片堆(LFH)。根据MSDN中的说明,只有在XP和2003系统中,默认堆才是标准堆;
4、关闭控制台窗口返回到“MemoryMgtDemo2.cpp”文件中。为了方便输出堆实例的信息,可以将打印堆信息的代码放入一个独立定义的函数“tx_print_heap_info”中。以后需要输出堆信息时,只需要调用此函数即可;
5、继续向main函数中增加“将调用进程默认堆设置为标准堆”的测试代码,然后调试运行程序。在新增代码中,使用HeapSetInformation函数将默认堆设置为标准堆,可惜在Win7系统中,除了将堆设置为LFH外,其他堆类型均会设置失败,并且返回错误码31;
6、在弹出的控制台窗口中,可以见到“将默认堆设置为标准堆失败…”的字样。在Win7系统中,默认情况下所有堆(无论是默认堆,还是通过HeapCreate创建的堆)都是LFH,并且禁止程序修改。有意思的是,你可以通过HeapSetInformation函数将一个LFH设置为LFH(即该函数会调用成功);
7、关闭控制台窗口返回到main函数中,继续垢卜埂呦增加“创建一个默认大小的堆”的测试程序。然后调试运行程序。Windows为我们提供了HeapCreate和HeapDestroy函数,分别用于创建和销毁堆实例。创建一个默认大小的堆,只需要在调用HeapCreate函数将其初始大小和最大大小均设置为0即可,系统会负责维护其大小变化;
8、在弹出的控制台窗口中,可以确认默认大小的堆创建成功;
9、关闭控制台窗口返回到main函数中,继续添加“创建一个固定大小(1024字节)的堆”的测试代码,然后调试运行程序。调用HeapCreate函数创建堆实例时,如果将初始大小和固定大小设置为相同的大于0的值,则可以创建一个固定大小的堆实例。这种堆一经创建就会独占系统中指定大小的空间;
10、在弹出的控制台窗口中,可以见到固定大小的堆实例创建成功的输出信息;
11、关闭控制台窗口返回到main函数中,继续添加“销毁堆实例”的代码,保证程序中创建的堆实例都能正常释放,防止内存泄漏。代码编写完毕后,调试运行程序,随后将弹出的控制台窗口关闭。无异常则表示创建的堆实例释放成功;
12、至此,创建和销毁堆实例的测试代码就介绍完毕了。在使用中务必记得HeapCreate函数和HeapDestroy函数应当成对出现,防止堆实例因为未销毁而出现内存泄漏。Enjoy!