主要内容

Windows 上的分配/取消分配函数不匹配

不正确的释放函数会导致内存损坏问题

描述

当您使用的 Windows® 释放函数未与相应的分配函数正确配对时,就会出现此缺陷。

风险

使用与分配函数不匹配的函数取消内存分配可能会导致内存损坏或未定义的行为。如果您使用的是旧版本的 Windows,不正确的函数还可能导致与新版本的兼容性问题。

修复

根据此表中列出的函数正确配对您的分配和释放函数。

分配函数释放函数
malloc()free()
realloc()free()
calloc()free()
_aligned_malloc()_aligned_free()
_aligned_offset_malloc()_aligned_free()
_aligned_realloc()_aligned_free()
_aligned_offset_realloc()_aligned_free()
_aligned_recalloc()_aligned_free()
_aligned_offset_recalloc()_aligned_free()
_malloca()_freea()
LocalAlloc()LocalFree()
LocalReAlloc()LocalFree()
GlobalAlloc()GlobalFree()
GlobalReAlloc()GlobalFree()
VirtualAlloc()VirtualFree()
VirtualAllocEx()VirtualFreeEx()
VirtualAllocExNuma()VirtualFreeEx()
HeapAlloc()HeapFree()
HeapReAlloc()HeapFree()

示例

全部展开

#ifdef _WIN32_
#include <windows.h>
#else
#define _WIN32_
typedef void *HANDLE;
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
typedef unsigned int UINT;
extern HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
extern HLOCAL LocalFree(HLOCAL hMem);
extern HGLOBAL GlobalFree(HGLOBAL hMem);
#endif

#define SIZE9 9


void func(void)
{
	/* Memory allocation */
    HLOCAL p = LocalAlloc(0x0000, SIZE9);
	
    if (p) {
		/* Memory deallocation. */
        GlobalFree(p);
		
    }
}
     
      

在此示例中,使用了 LocallAlloc() 来分配内存。然后程序错误地使用 GlobalFree() 来释放内存。

更正 - 正确配对 Windows 分配和释放函数

当您使用 LocalAllocate() 分配内存时,请使用 LocalFree() 释放内存。

#ifdef _WIN32_
#include <windows.h>
#else
#define _WIN32_
typedef void *HANDLE;
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
typedef unsigned int UINT;
extern HLOCAL LocalAlloc(UINT uFlags, UINT uBytes);
extern HLOCAL LocalFree(HLOCAL hMem);
extern HGLOBAL GlobalFree(HGLOBAL hMem);
#endif

#define SIZE9 9
void func(void)
{
	/* Memory allocation */
    HLOCAL p = LocalAlloc(0x0000, SIZE9);
    if (p) {
		/* Memory deallocation. */
        LocalFree(p);  
    }
} 

结果信息

组:动态内存
语言:C | C++
默认值:关闭
命令行语法:WIN_MISMATCH_DEALLOC
影响

版本历史记录

在 R2017b 中推出