文章目录[x]
- 0.1:指针所占内存空间
- 0.2:空指针
- 0.3:野指针
- 0.4:const修饰指针
指针
指针所占内存空间
指针在32位系统下所占4个字节,64位操作系统占8个字节,不管是什么数据类型。
空指针
空指针:指变量指向内存中编号为0的空间。
初始化指针变量
注意:空指针指向的内存是不可以访问的。内存编号0~255为系统占用内存,不允许用户访问。
野指针
野指针:指针变量指向非法的内存空间,未经分配的地址,没有访问权限的地址。
const修饰指针
常量指针:指针的指向可以修改,但是指针指向的值不可以修改
const int *P=&a;
*p=20; //错误,指向a的值不可以被修改
p=&b; //正确,指向可以被修改
指针常量:指针的指向不可以改,但是指针指向的值可以修改。
int * const P=&a;
*p=20; //正确,指向的值可以修改
p=&b; //错误,指针的指向不可以被修改
const即修饰指针又修饰常量:指针的指向和指针指向的值都不可以修改
const int * const P=&a;
*p=20; //错误,指向的值不可以修改
p=&b; //错误,指针的指向不可以被修改
内存分区模型
C++程序在执行时,将内存分为4个区域
代码区:存放函数体的二进制代码,由操作系统进行管理;
全局区:存放全局变量和静态变量以及常量;
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等;
堆区:由程序员分配和释放,若程序员不释放,程序结束时候由操作系统回收;
深拷贝与浅拷贝
浅拷贝:简单的赋值操作
优点:通过拷贝构造函数的实例化的对象的指针数据变量指向的共享的内存空间,因此内存开销较小
缺点:对象的析构的时候,看你会造成重复释放或者造成内存泄漏
深拷贝:在堆区重新申请空间,进行拷贝操作
浅拷贝带来的问题就是堆区的内存重复释放,需要利用深拷贝进行解决。
优点:每一个的对象的指针都有指向的内存空间,而不是共享,所以在对象析构的时候,不存在重复释放或者内存泄漏问题。
缺点:内存开销较大
总结:如果属性有在堆区开辟,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。