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 [] 会调用对应析构函数来释放内存。