目录
4、operator new与operator delete函数(重要点进行讲解)
operator new和operator delete的意义体现在new和delete的底层原理:
重载operator new与operator delete(了解)
6. 定位new表达式(placement-new) (了解)
1. C/C++内存分布
我们先来看下面的一段代码和相关问题:
int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); }
1. 选择题: 选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)
globalVar在哪里?__C__ staticGlobalVar在哪里?_C___
staticVar在哪里?_C___ localVar在哪里?__A__
num1 在哪里?_A___ char2在哪里?_A___
*char2在哪里?_A__ pChar3在哪里?_A___
*pChar3在哪里?_D___ ptr1在哪里?_A___ *ptr1在哪里?_B___
2. 填空题: sizeof(num1) = _40___; sizeof(char2) = _5___; strlen(char2) = _4___; sizeof(pChar3) = __4__; strlen(pChar3) = _5___; sizeof(ptr1) = _4___;
sizeof操作符的结果类型为size_t(The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.)(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。
【说明】
1. 栈 又叫堆栈 -- 非静态局部变量 / 函数参数 / 返回值等等,栈是向下增长的。2. 内存映射段 是高效的 I/O 映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。( Linux 课程如果没学到这块,现在只需要了解一下)3. 堆 用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段 -- 存储全局数据和静态数据。5. 代码段 -- 可执行的代码 / 只读常量。
2、C语言中动态内存管理方式
先给出一段代码演示:
void Test() { int* p1 = (int*)malloc(sizeof(int)); free(p1); int* p2 = (int*)calloc(4, sizeof(int)); free(p2); int* p3 = (int*)realloc(p2, sizeof(int) * 10); free(p3); }
malloc:
在内存的动态存储区中分配一块长度为size字节的连续区域,参数size为需要内存空间的长度,返回该区域的首地址calloc:
与malloc相似,不过函数calloc() 会将所分配的内存空间中的每一位都初始化为零realloc:
给一个已经分配了地址的指针重新分配空间,可以做到对动态开辟内存大小的调整。
相同点:
1.都是C语言标准库提供的从堆上申请内存空间的方法。
2.使用时需要包含stdlib.h头文件
3.返回值都是void*,使用时必须进行强转
4.申请成功返回空间首地址,失败则返回NULL,因此使用的时候一定要进行判空
5.用完之后一定要进行free释放,否则会有内存泄漏。
不同点:
void* mallod(size_t size)
size:要申请的空间总共占的字节数
void* calloc(size_t num,size_t size)
num:申请num个元素的空间
size:每个元素所占的字节数
num*size的含义就和malloc'参数的函数相同,但是其会将申请的空间中的内容全部初始化为0
void* realloc(void* p,size_t newsize)
1.p为NULL,该方法相当于malloc
2.p非空,将p指向的空间大小调整为newsize个字节
3、C++内存管理方式
C 语言内存管理方式在 C++ 中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此