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

栈与堆的区别:
1.管理方式不同
栈是系统自动管理的,在超出作用域后,将自动被释放
堆是手动释放,若程序中不释放,程序结束后将由操作系统回收
2.空间大小不同
堆的大小受限于物理内存范围
栈小的可怜,一般为8M(可通过更改系统配置来增加栈的大小)
3.分配方式不同
堆是动态分配
栈既支持动态分配也支持静态分配
4.分配效率不同
栈是系统中提供的数据结构
堆是C++函数库提供(链表)
5.是否产生碎片
栈:不会产生碎片
堆:由于频繁分配和释放,会造成内存空间的不连续,产生碎片
6.增长方向不同
栈向下增长 降序分配内存地址
堆向上增长 升序分配内存地址
指针
1.空指针
在C++中讲指针初始化为 **0** 和 **NULL** 都代表空指针
在C++中添加的nullptr可以保证在任何情况下都代表空指针(建议使用)
int *p=0;
int *p=NULL;
int *p=nullptr;
使用空指针的后果
- 对空指针解引用,程序会崩溃
int *p=NULL;
cout <<"&p="<<&p<<endl; //对空指针解引用,程序会崩溃
2.对空指针使用delete运算符,系统会忽略该操作,程序不会崩溃
int *p=NULL;
delete p; //对空指针使用delete运算符,到这里不会报错
cout <<"&p="<<&p<<endl; //对空指针解引用,程序会崩溃
为什么空指针访问会出现异常
空指针是程序**无论何时**都没有物理存储器与之对应的地址,而为了确保“***无论何时”***这个条件,人们定义了空指针的****分区(0x00000000~0x0000ffff)
2.野指针
指针指向的不是一个有效(合法)的内存地址
出现野指针的情况(三种)
1.指针在定义时未初始化,其值不确定 2.指向堆分配的内存被释放时,指针指向的地址无效3.指针指向的变量已超越了变量作用域
针对的解决方法
1.将指针初始化为nullptr 2.堆内存释放后将指针置为nullptr3.函数不返回局部变量的地址
3.函数指针和回调函数
使用函数指针的3个步骤
1.声明函数指针 2.函数指针指向函数地址(在C++中,函数名就是函数地址)3.通过函数指针调用函数
/* 使用函数指针步骤
1.定义函数指针
int func(int a,std::string b)——>int (*pfunc)(int,std::string)
2.函数指针指向函数的地址(在C++中,函数名就是函数的地址)
pfunc=func;
3.通过函数指针调用函数
C++语法: C语言语法:
pfunc(a,b) (*pfunc)(a,b)
*/
C++内存模型&空指针、野指针、函数指针和回调函数的更多相关文章
- c++指针函数的使用——回调函数
/* 函数指针 函数也是有地址的 所谓函数指针,就是指向函数的指针,函数指针也是一个变量,可以指向不同的函数.同时通过函数指针可以调用其指向函数,从而使函数的调用更加灵活. 函数指针的用途 */ #i ...
- C++-函数与指针的关系(回调函数)
1.函数类型 C语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 ★ int add(int i, int j)的类型为int(int, int) C语言中通过typede ...
- JS中的匿名函数、回调函数、匿名回调函数
工欲善其事必先利其器 在学习JavaScript设计模式一书时,遇到了“匿名回调函数”这个概念,有点疑惑,查找了些资料重新看了下函数的相关知识点之后,对这个概念有了认识.九层之台,起于垒土.在熟悉这一 ...
- golang中匿名函数的应用-回调函数-闭包
package main import ( "fmt" "strconv" ) type funcType func(int, int) int // 自定义函 ...
- mongoose的update函数中的回调函数是必须要传的吗
mongoose中的update的回调函数是必须要传的,如果不传,则不会更新. 例如这样写是不会更新的 tagModel.update({name:tagName},{$inc:{total:1}}, ...
- $.ajax({ }) 里面的success函数不执行 | 回调函数返回的值 用对象,下标,键值对访问不到时
原因一般是 dataType:'json' 数据类型设置成了json ,去掉这个设置即可 $.ajax({ }) 回调函数返回的值 用对象,下标,键值对访问不到时,考虑是否返回数据为字符串 考虑是 ...
- LUA使用虚函数与使用回调函数
------------------虚函数overload-------------------------- --回调:寻路中格子坐标改变 CHero.OnSearchToCellsChange = ...
- 在Java中如何编写回调函数,以及回调函数的简单应用
import static java.lang.System.out; import static java.lang.System.err; import java.util.logging.Lev ...
- Promise对象的resolve回调函数和reject回调函数使用
Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是 ...
- js for 循环中有异步函数时,回调函数总是最后一步的值。
原因:for循环执行时不会等待异步函数执行. 解决方法: 1.改为递归函数(暂时不会). 2.构建一个自执行函数传参(匿名函数) 参考::https://www.cnblogs.com/csuwuji ...
随机推荐
- Vulnhub Bravery靶机 Walkthrough
Bravery Recon 使用netdiscover对本地网络进行arp扫描. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 ...
- 四月十号java知识点
1.数组:若干个相同数据类型元素按照一定顺序排列的集合2.JAVA语言内存分为栈内存和堆内存3.方法中的一些基本类型变量和对象的引用变量都在方法中的栈内存中分配4.堆内存用来存放new运算符创建的数组 ...
- 【Spring专题】「技术原理」从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理
ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常.当应用程序中发生异常时,ExceptionHandler将优先地拦截 ...
- shopee V2 接口 虾皮货代打包贴单仓储系统,独立部署,系统源码 终身使用,没有任何隐形收费,想怎么用就怎么用 直接就已经对接好了的接口。
shopee V2 接口 虾皮货代打包贴单仓储系统,独立部署,系统源码 终身使用,没有任何隐形收费,想怎么用就怎么用 直接就已经对接好了的接口. 虾皮货代打包 系统虾皮代贴单系统 虾皮跨境平台源码 ...
- Java 的 SPI 机制
什么是SPI机制? SPI机制( Service Provider Interface)是Java的一种服务发现机制,为了方便应用扩展.那什么是服务发现机制?简单来说,就是你定义了一个接口,但是不提供 ...
- js复制功能(pc复制,移动端复制到手机剪切板)
一个函数,直接调就好了,已测pc和app都适用 1 // 一键复制 2 copyBtn(data) { 3 const input = document.createElement("inp ...
- 牛客网:华为机试题(python版本)
输入一行:input() 输入的一行有多个信息:input().split() 有多组测试用例(多组同时输入): while true try except... 1.计算字符串最后一个单词的长度,单 ...
- SPSS计算极值、平均值、中位数、方差、偏度、峰度、变异系数
本文介绍基于SPSS软件的经典统计学分析与偏度.峰度等常用统计学指标的计算方法. 首先需要说明,本文所述数据的经典统计学分析,包括计算数据的极值.平均值.中位数.标准差.方差.变异系数.偏度与 ...
- 音视频八股文(6)-- ffmpeg大体介绍和内存模型
播放器框架 常用音视频术语 • 容器/文件(Conainer/File):即特定格式的多媒体文件, 比如mp4.flv.mkv等. • 媒体流(Stream):表示时间轴上的一段连续数据,如一 段声音 ...
- 2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的
2022-04-07:给定一个只由'a'和'b'组成的字符串str, str中"ab"和"ba"子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消 ...