一、C语言动态内存管理
C语言使用malloc/calloc/realloc/free进行动态内存管理
#include<stdio.h>
int main()
{
//malloc一次最多申请1兆的内存空间
//当返回值为NULL时,不再继续分配空间
int* p1 = (int*)malloc(sizeof(int)* 4);
free(p1);
//calloc将申请的空间初始化为0
int* p2 = (int*)calloc(4, sizeof(int));
//realloc
//1、原来没有空间,直接申请空间,相当于malloc
//2、扩容:改变原有的空间大小
//3、重新开空间:开辟一段新的空间,将原有内存的内容拷贝过去
//注意:不会对新开辟的空间初始化
int* p3 = (int*)realloc(p2, sizeof(int)* 6);
free(p3);
return 0;
}
注意:堆上的内存,需要用户自己来管理,动态malloc/calloc/realloc的空间必须要free掉,否则会造成内存泄漏
栈上的空间具有函数作用域,在函数结束后系统自定回收,不用用户管理
二、C++动态内存管理
C++通过new和delete运算符进行内存管理
注意:new和delete、new[]和delete[]一定要配对使用
三、malloc/free和new/delete的区别和联系:
(1)它们都是动态管理内存的入口
(2)malloc/free是C/C++标准库的函数,new/delete是C++操作符
(3)malloc/free只是进行动态分配/释放内存空间。new/delete除了会分配空间还会调用构造函数和新、析构函数进行初始化和清理(清理成员)
(4)malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型大小返回对应的类型的指针
四、C++的其他内存管理接口
void* operator new(size_t size);
void operator delete(size_t size);
void *operator new[](size_t size);
void operator delete[](size_t size);
(1)operator new/operator delete、operator new[]/operator delete[]和malloc/free用法一样
(2)它们值负责分配/释放空间,不会调用对象构造函数/析构函数来初始化/清理对象
(3)实际上operatror new/operator delete只是malloc/free的一层封装
【new作用】
调用operator new 分配空间
调用构造函数初始化对象
【delete作用】
调用析构函数清理对象
调用operator delete释放空间
【new[]作用】
调用operator new分配空间
调用N次构造函数分别初始化每个对象
【delete[]作用】
调用N次析构函数清理对象
调用operator delete释放空间
面试题
static int s1 = 1;
int s2 = 2;
int f(int a)
{
static int s3 = 3;
char *p1 = "abcd";
char p2[] = "abcd";
char *p3 = new char[10];
//1、计算下列结果
sizeof(p1) 4 指针的大小
sizeof(p2) 5 数组的大小(数组大小不计\0)
strlen(p1) 4 strlen 不计\0
strlen(p2) 4 strlen 不计\0
//2、下面代码是否可以通过编译?如果通不过,是那句有问题?
*p1 = '1'; 不行,p1指向常量区
*p2 = '2';
//3、选择题
A、栈 B、堆 C、静态区 D、常量区
s1在哪 C
s2在哪 C
s3在哪 C
p1在哪 A
p2在哪 A
p3在哪 A
*p1在哪 D
*p2在哪 A
*p3在哪 B
}