目录
1. C/C++程序内存划分
2. C语言中内存管理的方式
3. new /delete 和 new[]/delete[]
4. void* operator new(size_t size) 和 void operator delete(void*) 可以重载的
5. 定义为new表达式
6. 常见的面试题
1. C/C++程序内存划分
2. C语言中内存管理的方式
2.1申请malloc/calloc/realloc
malloc函数的功能是开辟指定字节大小的内存空间,如果开辟成功就返回该空间的首地址,如果开辟失败就返回一个NULL。传参时只需传入需要开辟的字节个数。
calloc函数的功能也是开辟指定大小的内存空间,如果开辟成功就返回该空间的首地址,如果开辟失败就返回一个NULL。calloc函数传参时需要传入开辟的内存用于存放的元素个数和每个元素的大小。calloc函数开辟好内存后会将空间内容中的每一个字节都初始化为0。
realloc函数可以调整已经开辟好的动态内存的大小,第一个参数是需要调整大小的动态内存的首地址,第二个参数是动态内存调整后的新大小。realloc函数与上面两个函数一样,如果开辟成功便返回开辟好的内存的首地址,开辟失败则返回NULL。
realloc函数调整动态内存大小的时候会有三种情况:
1、原地扩。需扩展的空间后方有足够的空间可供扩展,此时,realloc函数直接在原空间后方进行扩展,并返回该内存空间首地址(即原来的首地址)。
2、异地扩。需扩展的空间后方没有足够的空间可供扩展,此时,realloc函数会在堆区中重新找一块满足要求的内存空间,把原空间内的数据拷贝到新空间中,并主动将原空间内存释放(即还给操作系统),返回新内存空间的首地址。
3、扩充失败。需扩展的空间后方没有足够的空间可供扩展,并且堆区中也没有符合需要开辟的内存大小的空间。结果就是开辟内存失败,返回一个NULL。
2.2释放free
free函数的作用就是将malloc、calloc以及realloc函数申请的动态内存空间释放,其释放空间的大小取决于之前申请的内存空间的大小。
3. new /delete 和 new[]/delete[]
3.1使用方式
//动态申请单个某类型的空间
int* p=new int;
delete p;
//动态申请多个某类型的空间
int* p=new int[10];
delete[]p;
//动态申请单个某类型的空间并初始化
int* p=new int(10);
delete p;
//动态申请多个某类型的空间并初始化
int* p=new int[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
delete[] p;
//自定义类型也是一样的
3.2底层实现原理
new的实现原理
调用void* operator new(size_t size)--->循环调用malloc
自定义类型 a. 调用void* operator new(size_t size)--->循环调用malloc b. 调用构造函数初始化对象
4. void* operator new(size_t size) 和 void operator delete(void*) 可以重载的
5. 定义为new表达式
5.1语法格式
5.2使用场景:内存池
6. 常见的面试题
1.malloc/free和new/delete的区别
2.内存泄漏
2.1什么是内存泄漏?
2.2内存泄漏分类
2.3如何检测内存泄漏
2.4如何避免内存泄漏