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 ...
随机推荐
- 从内核源码看 slab 内存池的创建初始化流程
在上篇文章 <细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现 >中,笔者从 slab cache 的总体架构演进角度以及 slab cache 的运行原理角度为大家勾勒 ...
- Java构建树结构的公共方法
一.前提 pId需要传入用来确认第一级的父节点,而且pId可以为null. 树实体类必须实现:TreeNode接口 MyTreeVo必须有这三个属性:id.pId.children 可以根据不同需求, ...
- JAVASE和JAVAEE的区别
JAVASE和JAVAEE的区别 JavaEE: Java Enterprise Edition,Java企业版,多用于企业级开发,包括web开发等等.企业版本帮助开发和部署可移植.健壮.可伸缩切安全 ...
- 【SpringCloud】(一)分布式理论
分布式架构理论 方法远程调用 各个模块运行于不同的tomcat,模块之间通过网络进行调用. 远程调用的技术演进 1 WebService 解决应用程序之间的跨平台访问问题,基于SOAP/WSDL协议, ...
- 版本依赖控制工具Maven
Maven 简介 依赖管理工具 如果说A工程里面用到了B工程的类.接口.配置文件等这样的资源,那么就说A依赖B 构建管理工具 构建:使用原材料生产产品的过程 安装:把一个Maven工程经过打包操作生产 ...
- Linux shell和环境变量
环境变量 存储有关shell会话和工作环境信息:允许在内存中存储数据. 注意什么时候要用$ 什么时候不用$:用到变量,需要$;操作变量,不需要$.printenv除外 分为两类: 全局变量:对shel ...
- 一文详解RocketMQ-Spring的源码解析与实战
摘要:这篇文章主要介绍 Spring Boot 项目使用 rocketmq-spring SDK 实现消息收发的操作流程,同时笔者会从开发者的角度解读 SDK 的设计逻辑. 本文分享自华为云社区< ...
- 劲(很)霸(不)酷(好)炫(用)的NLP可视化包:Dodorio 使用指北
朋友们,朋友们,事情是这样的.最近心血来潮,突然想起很久以前看过的一个NLP可视化包.它的效果是下面这个样子: 在此之前,已经有一些文章从论文的角度对这个包进行了介绍,详情请见 推荐一个可交互的 At ...
- Redis报错MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on
1.错误信息 org.redisson.client.RedisException: MISCONF Redis is configured to save RDB snapshots, but is ...
- Mac M系列芯片 vue前端node-sass兼容问题解决
0.由于M系列芯片是arm架构,在使用brew安装node时都是arm的node,但是node-sass@4.14.1版本中不支持arm架构的出现如下报错: Error: Node Sass does ...