目录
operator new与operator delete函数
C/C++内存分布
说明:
C语言中动态内存管理方式
函数声明:
void* malloc(unsigned size);
void* realloc(void* ptr, unsigned newsize);
void* calloc(size_t numElements, size_t sizeOfElement);
int* p1 = (int*)malloc(sizeof(int));
int* p2 = (int*)calloc(4, sizeof(int));
int* p3 = (int*)realloc(p2, sizeof(int) * 10);
malloc/calloc/realloc的区别?
都是从堆上申请空间的,最后都需要用free释放,返回值类型都是void*,在使用时都需要强转以及判空
malloc:参数含义表示所需要申请空间的字节数
calloc: 1.参数: 参数1-->元素个数 参数2-->类型所占的字节数
2.功能: 从堆上申请空间&会将空间中的每个字节初始化为0
realloc(void* p. int newsize):p是空: 相当于是malloc
p不是空: realloc会将p指向的空间调整到newsize个字节
malloc是怎么实现的:
Malloc函数用于动态分配内存。 为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。 当用户申请内存时,直接从堆区分配一块合适的空闲块。 Malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块和未分配块;同时malloc采用显示链表结构来管理所有的空闲块,即使用一个双向链表将空闲块连接起来,每一个空闲块记录了一个连续的、未分配的地址。 当进行内存分配时,Malloc会通过隐式链表遍历所有的空闲块,选择满足要求的块进行分配;当进行内存合并时,malloc采用边界标记法,根据每个块的前后块是否已经分配来决定是否进行块合并。
C++内存管理方式
void Test()
{
// 动态申请一个int类型的空间
int* ptr4 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ptr5 = new int(10);
// 动态申请10个int类型的空间
int* ptr6 = new int[10];
delete ptr4;
delete ptr5;
delete[] ptr6;
}
![](https://i-blog.csdnimg.cn/blog_migrate/8bca84c71cb8ae941d8cf2ae10fa5040.png)
注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]
new和delete操作自定义类型
class new_pt {
public:
new_pt()
: _data(0) {}
~new_pt(){}
private:
int _data;
};
void Test3() {
new_pt* ptr1 = (new_pt*)malloc(sizeof(new_pt));
free(ptr1);
new_pt* ptr2 = (new_pt*)malloc(sizeof(new_pt) * 10);
free(pt