C++内存模型&空指针、野指针、函数指针和回调函数

2023-07-08 17:46:10

C++内存模型

栈与堆的区别:

1.管理方式不同

栈是系统自动管理的,在超出作用域后,将自动被释放堆是手动释放,若程序中不释放,程序结束后将由操作系统回收

2.空间大小不同


【资料图】

堆的大小受限于物理内存范围栈小的可怜,一般为8M(可通过更改系统配置来增加栈的大小)

3.分配方式不同

堆是动态分配栈既支持动态分配也支持静态分配

4.分配效率不同

栈是系统中提供的数据结构堆是C++函数库提供(链表)

5.是否产生碎片

栈:不会产生碎片堆:由于频繁分配和释放,会造成内存空间的不连续,产生碎片

6.增长方向不同

栈向下增长   降序分配内存地址堆向上增长   升序分配内存地址

指针

1.空指针

在C++中讲指针初始化为 **0** 和 **NULL** 都代表空指针⭕在C++中添加的**nullptr**可以保证在任何情况下都代表空指针(建议使用)

❗使用空指针的后果

对空指针解引用,程序会崩溃

int *p=NULL;cout <<"&p="<<&p<<endl;     //对空指针解引用,程序会崩溃

2.对空指针使用delete运算符,系统会忽略该操作,程序不会崩溃

❓为什么空指针访问会出现异常

空指针是程序无论何时都没有物理存储器与之对应的地址,而为了确保“无论何时”这个条件,人们定义了空指针的空闲分区(0x00000000~0x0000ffff)

2.野指针

指针指向的不是一个有效(合法)的内存地址

❗出现野指针的情况(三种)

1.指针在定义时未初始化,其值不确定2.指向堆分配的内存被释放时,指针指向的地址无效3.指针指向的变量已超越了变量作用域

针对的解决方法

1.将指针初始化为nullptr2.堆内存释放后将指针置为nullptr3.函数不返回局部变量的地址

3.函数指针和回调函数

⭕使用函数指针的3个步骤

1.声明函数指针2.函数指针指向函数地址(在C++中,函数名就是函数地址)3.通过函数指针调用函数

关闭
精彩放送