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;

使用空指针的后果

  1. 对空指针解引用,程序会崩溃
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.堆内存释放后将指针置为nullptr



3.函数不返回局部变量的地址

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++内存模型&空指针、野指针、函数指针和回调函数的更多相关文章

  1. c++指针函数的使用——回调函数

    /* 函数指针 函数也是有地址的 所谓函数指针,就是指向函数的指针,函数指针也是一个变量,可以指向不同的函数.同时通过函数指针可以调用其指向函数,从而使函数的调用更加灵活. 函数指针的用途 */ #i ...

  2. C++-函数与指针的关系(回调函数)

    1.函数类型 C语言中的函数有自己特定的类型 函数的类型由返回值,参数类型和参数个数共同决定 ★ int add(int i, int j)的类型为int(int, int) C语言中通过typede ...

  3. JS中的匿名函数、回调函数、匿名回调函数

    工欲善其事必先利其器 在学习JavaScript设计模式一书时,遇到了“匿名回调函数”这个概念,有点疑惑,查找了些资料重新看了下函数的相关知识点之后,对这个概念有了认识.九层之台,起于垒土.在熟悉这一 ...

  4. golang中匿名函数的应用-回调函数-闭包

    package main import ( "fmt" "strconv" ) type funcType func(int, int) int // 自定义函 ...

  5. mongoose的update函数中的回调函数是必须要传的吗

    mongoose中的update的回调函数是必须要传的,如果不传,则不会更新. 例如这样写是不会更新的 tagModel.update({name:tagName},{$inc:{total:1}}, ...

  6. $.ajax({ }) 里面的success函数不执行 | 回调函数返回的值 用对象,下标,键值对访问不到时

    原因一般是  dataType:'json' 数据类型设置成了json  ,去掉这个设置即可 $.ajax({ }) 回调函数返回的值 用对象,下标,键值对访问不到时,考虑是否返回数据为字符串 考虑是 ...

  7. LUA使用虚函数与使用回调函数

    ------------------虚函数overload-------------------------- --回调:寻路中格子坐标改变 CHero.OnSearchToCellsChange = ...

  8. 在Java中如何编写回调函数,以及回调函数的简单应用

    import static java.lang.System.out; import static java.lang.System.err; import java.util.logging.Lev ...

  9. Promise对象的resolve回调函数和reject回调函数使用

    Promise是ES6中用来结局回调地狱的问题的但是并不能帮我们减少代码量 Promise是一个构造函数 new Promise() 得到一个Promise一个实例 在Promise上有两个函数分别是 ...

  10. js for 循环中有异步函数时,回调函数总是最后一步的值。

    原因:for循环执行时不会等待异步函数执行. 解决方法: 1.改为递归函数(暂时不会). 2.构建一个自执行函数传参(匿名函数) 参考::https://www.cnblogs.com/csuwuji ...

随机推荐

  1. 打造自己的ChatGPT:逐字打印的流式处理

    接口的延迟 在调用OpenAI的接口时,不免会有很慢的感觉,抛去地理位置上的网络延迟,大量的延迟往往发生在响应生成的过程中. 因此,如果使用同步接口的话,需要等待响应完全生成之后才能最终显示输出结果, ...

  2. systemctl 命令设置开机自启动失败

    哈喽大家好,我是咸鱼.今天跟大家分享一个关于 Linux 服务(service)相关的案例   案例现象 我在 3 月 31日的时候发表了一篇<shell 脚本之一键部署安装 Nginx> ...

  3. Nvidia Tensor Core-WMMA API编程入门

    1 WMMA (Warp-level Matrix Multiply Accumulate) API 对于计算能力在7.0及以上的CUDA设备,可以使用CUDA C++ API调用Tensor Cor ...

  4. laravel实现大数据csv导出

    首先说明几点: excel格式的文件最大支持100万的数据,所以不考虑使用excel格式 laravel的toArray()方法有内存泄露,所以大量数据导出不能使用. 当然要使用chunk方法查询数据 ...

  5. 基于Python的爬虫案例

    案例1:使用爬虫爬取京东华为手机用户评论 本案例借鉴哔哩哔哩博客主视频教程,感谢其教程为我开启了爬虫之旅:https://www.bilibili.com/video/BV1Yt4y1Y7nt?t=3 ...

  6. 记一次 .NET某医疗器械清洗系统 卡死分析

    一:背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题,回过头来看这个案例比较经典,这篇稍微整理一下供后来者少踩坑吧. 二:WinDbg 分析 1. 为什么会卡死 因为是窗体程 ...

  7. 搭建CTF动态靶场

    前言 本文借鉴文章:https://www.yuque.com/dengfenglai-esbap/kb/mc4k41?#xOxNG 在此基础上修改了一点(照着原来的做没成功),感谢这位师傅给的资源. ...

  8. 牛客网:华为机试题(python版本)

    输入一行:input() 输入的一行有多个信息:input().split() 有多组测试用例(多组同时输入): while true try except... 1.计算字符串最后一个单词的长度,单 ...

  9. [人脸活体检测] 论文:Face Anti-Spoofing Using Patch and Depth-based CNNs

    Face Anti-Spoofing Using Patch and Depth-based CNNs 这篇文章是人脸防伪领域比较容易理解,适合入手的一篇,主要运用到了两个CNN网络,根据输入图像的细 ...

  10. Python学习——Juptyer Notebook快捷键的使用

    1. 运行当前Cell:Ctrl + Enter 2. 运行当前Cell并在其下方插入一个新的Cell:Alt + Enter 3. 运行当前Cell并选中其下方的Cell:Shift + Enter ...