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 ...
随机推荐
- 介绍箭头函数的 this
由于箭头函数不绑定this, 它会捕获其所在(即定义的位置)上下文的this值, 作为自己的this值 1. 所以 call() / apply() / bind() 方法对于箭头函数来说只是传入参数 ...
- 论文解读(PAWS)《Semi-Supervised Learning of Visual Features by Non-Parametrically Predicting View Assignments with Support Samples》
论文信息 论文标题:Semi-Supervised Learning of Visual Features by Non-Parametrically Predicting View Assignme ...
- 龙芯(Loongarch64),在Linux虚拟一个龙芯OS体验下
前言 想体验下龙芯OS,但是又没有龙芯开发板或者龙芯实体机.手头上只有一个X64环境的Linux发行版,应该怎么做呢? 概括 其实非常简单,可以通过Chroot命令和Qemu在X64的指令集系统上模拟 ...
- 5221. 【GDOI2018模拟7.10】A
题目大意: 给你一棵有根树,问你在这棵树上总共有多少棵子树的节点构成了一个完整的整数区间. 考试想法: 考试时就想到了正解,正解就是从下到上遍历整一棵树,每一个节点记录一下它的最小值min.最大值ma ...
- gRPC 应用指引
一.核心概念.架构及生命周期 1.服务定义 gRPC 默认使用 protocol buffers. service HelloService { rpc SayHello (HelloRequest) ...
- JVM面试和学习中需要注意的部分
内存结构 1.方法区用来存储类加载的数据,例如类的名称,方法入口 2.JVM虚拟机栈用于存储线程,包括局部变量和方法参数 3.堆内存用来存储对象 4.方法区的规范实现:永久代和元空间 5.方法区 JV ...
- String、StringBuilder、StringBuffer使用场景
String:加了final修饰,长度不可变,每次修改会创建新String:操作少量数据或者不需要操作数据时使用. StringBuilder:长度可变,线程不安全:在需要频繁操作数据且不需要考虑线程 ...
- java英文字符串首字母大写
java英文字符串首字母大写 /** * 首字母大写 * @param string * @return */ public static String toUpperCase4Index(Strin ...
- selenium IDE插件的配置使用
开头 Selenium提供了一个可以自动录制脚本的插件 叫selenium IDE 让我们一起看看如何安装使用 安装 因为google扩展商城大多数人用不了,所以我们选用的是edag来下载seleni ...
- 2023-01-09:以下go语言代码输出什么?A:+Inf; B:zero; C:something else; D:doesn‘t compile。 package main import (
2023-01-09:以下go语言代码输出什么?A:+Inf: B:zero: C:something else: D:doesn't compile. package main import ( & ...