首页 > 系统相关 >C++内存模型&空指针、野指针、函数指针和回调函数

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

时间:2023-07-06 15:13:04浏览次数:40  
标签:函数 int C++ 内存 函数指针 指针

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;

❗使用空指针的后果

  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)
*/

标签:函数,int,C++,内存,函数指针,指针
From: https://www.cnblogs.com/huajianyizou/p/c-memory-model-zkw1az.html

相关文章

  • C++电影评分系统[2023-07-06]
    C++电影评分系统[2023-07-06]程序设计综合课程设计指导书一、题目:电影评分系统二、设计内容及要求:根据C++课程所学的概念、理论和方法,按照C++程序设计的基本步骤,设计出一个适当规模的程序来实现设计课程内容中的全部功能。本系统要求模拟实现电影评分系统,其中包括电影资源管......
  • 小学期C++实践
    一、链表1、#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineN100010structnode{intval;structnode*next;};structnode*head=NULL;intx;structnode*reverseList(structnode*head){structnode*h......
  • 【ChernoC++笔记】指针和引用
    指针【16】C++指针▶️指针的类型不影响指针的本质:任何type的指针都是保存着内存地址的整数(integer)。指针的type只用来使人更好理解。//一个最简单的void类型指针,储存内存地址0void*ptr=0;void*ptr=NULL;void*ptr=nullptr; //C++11//使ptr存储var的内存地......
  • C++程序课程设计任务书[2023-07-06]
    C++程序课程设计任务书[2023-07-06]C++程序课程设计任务书班级学号姓名一、实践目的该实践在系统学习《C++程序设计基础》课程后进行。通过本实践,培养学生使用C++解决实际问题的能力。二、实践任务与要求(任选一个任务,独立完成)任务一:(一)......
  • C/C++数据结构与算法课程设计[2023-07-03]
    C/C++数据结构与算法课程设计[2023-07-03]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • 结构体,指针函数和数组初始化
    struct_m_malloc_dev{void(*init)(uint8_t);//初始化函数uint8_t(*perused)(uint8_t);//内存使用率uint8_t*membase[SRAMBANK];//内存池管理srambank个区域的内存uint16_t*memmap[SRAMBANK];//内存管理状态表uint8_tmemrdy[SRAMBANK];//内存管理......
  • 一个C++11的线程函数
    一个C++11的线程函数#include<iostream>#include<thread>#include<chrono>voidprintNumbers(){for(inti=1;i<=100;++i){std::cout<<i<<std::endl;std::this_thread::sleep_for(std::chrono::millis......
  • C++ 重载运算符和重载函数
     C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数......
  • c语言结构体指针初始化
    结构体定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如int、float、char等),也可以是其他结构体类型、指针类型等......
  • C/C++ Qt 数据库SqlRelationalTable关联表
    在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelationalTable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,......