malloc之struct _CrtMemBlockHeader

本文详细解析了Visual Studio中内存管理的内部机制,重点介绍了_CrtMemBlockHeader结构体的作用和布局,阐述了其在malloc和free函数中如何确保内存安全,以及Debug模式下堆空间的特殊标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct _CrtMemBlockHeader
它存放了你申请的内存块信息,而这个结构体就存放在malloc所申请 返回的指针上面。

typedef struct _CrtMemBlockHeader
{
    struct _CrtMemBlockHeader *pBlockHeaderNext;//下一个结构体指针
    struct _CrtMemBlockHeader *pBlockHeaderPrev;//上一个结构体指针
    char    *szFileName;//szFileName是存储的发起分配操作的那行代码所在的文件的路径和名称
    int       nLine;//代码行号
    size_t  nDataSize;//请求分配的大小(字节)
    int        nBlockUse;//块类型。其中,1是自己调用、2为库函数调用、0为未调用。
    long     lRequest;   //堆申请次数
    unsigned char gap[nNoMansLandSize]; //溢出标志。其中,nNoMansLandSize = 4
} _CrtMemBlockHeader;
//在VS08 32位环境下
int *p = (int *)malloc(sizeof(int));

32字节的_CrtMemBlockHeader
+
4字节的申请空间
+
4字节的 unsigned char gap[nNoMansLandSize];//溢出标志

注意:两个溢出标志一旦有一个被修改,那么free释放空间时代码崩溃
int main()
{
	int *p = (int *)malloc(sizeof(int));
	/*
	*(p+1) = 1;
	free(p);
	*/崩溃
	*(p-1) = 1;
	free(p);//依旧崩溃
	return 0;
}

在这里插入图片描述
在这里插入图片描述
在Debug版本下, 申请的堆的可使用空间是用 ”CD” 符号填充的, “FD” 符号来防止越界, 在释放之后会使用 “EEFE” 符号来表示该区域是没有使用的区域。

如还有疑惑,请点击参考

### 关于 `pmem_malloc_ext_v2` 的 API 文档和使用示例 #### 函数签名与参数说明 `pmem_malloc_ext_v2` 是用于持久内存分配的一个扩展函数。此函数允许应用程序通过指定额外配置来优化持久化内存的分配行为。 ```c void *pmem_malloc_ext_v2(size_t size, struct pmem_MALLOC_CONFIG_V2 *config); ``` - **size**: 请求分配的空间大小,单位为字节。 - **config**: 配置结构体指针,包含多种可选设置项以调整分配策略[^4]。 #### 结构体定义 为了更好地理解如何调用该接口,下面展示了一个简化版的配置结构体: ```c struct pmem_MALLOC_CONFIG_V2 { uint32_t flags; void (*ctor)(void *, size_t); /* 构造函数 */ }; ``` - **flags**: 控制标志位集合,用来启用特定功能或特性。 - **ctor**: 可选构造函数,在成功分配后立即执行初始化操作。 #### 使用实例 以下是一个简单的 C 语言程序片段,展示了如何利用上述提到的功能来进行持久内存对象创建并应用自定义构造逻辑: ```c #include <libpmem.h> #include "pmem_malloc.h" // 自定义构造方法 static void my_ctor(void *ptr, size_t sz) { memset(ptr, 0xAA, sz); // 将新分配区域填充为固定模式 } int main() { const size_t obj_size = 1 << 20; // 分配大约1MB空间 struct pmem_MALLOC_CONFIG_V2 config = { .flags = PMEM_MALLOC_FLAG_ZEROED, .ctor = &my_ctor }; char *obj = (char *)pmem_malloc_ext_v2(obj_size, &config); if (!obj) { perror("Failed to allocate persistent memory"); return -1; } printf("Allocated %zu bytes at address %p\n", obj_size, obj); free(obj); // 当不再需要时释放资源 return 0; } ``` 在这个例子中,除了请求一定量的持久存储外,还设置了两个重要的选项: - 设置了零初始化标记 (`PMEM_MALLOC_FLAG_ZEROED`) 来确保返回的新块已经被清零; - 提供了一个回调函数 `my_ctor()` ,它会在每次成功完成一次新的分配之后被自动触发,从而能够进一步定制刚获得的对象状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值