C-malloc 简介

C 使用 malloc() 和 free() 来动态分配和释放内存,C++ 使用 new 和 delete 来动态分配和释放内存。

C 管理数据的方式

malloc && free

malloc 的时候,会在上分配一块内存,然后返回一个指向这块内存第一个位置的指针。同时会记录一个 metadata,存储数据大小和分配状态等信息。

malloc 分配内存初值是随机的,需要手动初始化。

当使用 free 释放内存时,会检查 metadata,根据 metadata 决定所要释放数据的大小。

metadata 的存储位置一般在首地址之前,因此 free 的时候必须 free 首地址

结构化数据

用 struct 之类的结构体来管理数据时,指针类型直接指示了应该如何处理内存中的数据。

C++ 管理数据的方式

new && delete

直接 new 一个数据类型,比如 new int,不会设置 metadata,而是直接使用指针类型来管理内存大小,并根据指针类型调用对应构造函数来初始化数据。

new 的数据必须通过 delete 来删除,并且必须显式指定指针类型,因为 delete 不仅需要指针类型指示的内存大小,还会调用对应析构函数来释放内存。

new [] && delete []

new [] 会分配一块连续的内存,然后返回一个指向这块内存第一个位置的指针。同时会记录一个 metadata,存储数据大小和分配状态等信息。new [] 分配时会调用对应构造函数来初始化数据。

delete [] 会检查 metadata,根据 metadata 决定所要释放数据的大小。delete [] 会调用对应析构函数来释放内存。