Skip to content

cpp_heap_op

ShenYj edited this page Aug 3, 2023 · 1 revision

堆空间内存管理

malloc

在堆空间申请内存,返回空间的首地址

int *p = (int *)malloc(4);

*p = 10;

free

回收内存, 释放堆空间内存, 申请时多少,就释放多少

int *p = (int *)malloc(4);

free(p);

new

除了malloc的方式外,c++ 还提供了一个种方式来申请堆空间内存

/// 申请一个int 类型大小的空间内存
int *p = new int;

*p = 10;

相对比 malloc, 也不需要指定类型了

delete

释放内存, 配合 new 使用

int *p = new int;

delete p;

malloc 配合 free 使用, new 配合 delete 使用, 不能随意配对使用

注意点:

char *p = new char[4];
/// 一定要带中括号,否则无法完全销毁
delete p[];

memset

堆空间连续内存空间初始化,也可以用于清零、重置数据

char *p = new char[4];

/// 此时使用 *p = 1 无法无完全初始化申请的堆空间内存,因为char只有1个字节,这样只能初始化首地址的一个字节

/// 参数1: 内存地址
/// 参数2: 初始化的值
/// 参数3: 初始化多少字节
memset(p, 0, sizeof(char[4]));

new 也提供了初始化的方式

int *p1 = new int;          /// 未被初始化
int *p2 = new int();        /// 被初始化为0
int *p3 = new int(5);       /// 被初始化为5
int *p4 = new int[3];       /// 数组元素未被初始化
int *p5 = new int[3]();     /// 3个数组元素都被初始化为0
int *p6 = new int[3]{};     /// 3个数组元素都被初始化为0
int *p7 = new int[3]{ 5 };  /// 数组首元素被初始化为5,其他元素被初始化为0

通过汇编代码可以了解,自动调用了 memset 进行了初始化

是否初始化也取决于环境(平台)

Getting Started

Social

Clone this wiki locally