1.指针与引用
1
1.1概念
1.1.正常引用指左值引用。右值引用是cpp11里面加的。reference
1.2.是别名。int &别名=原名。不是对象。在初始化时与对象绑定而非拷贝
2.1指针是对象,也可间接访问。其指向对象可以变。其存的是对象地址。int * 指针名 = & 对象名。
2.2访问时用 *指针名。
1.2区别
引用非对象没有地址,但是指针有。因在符号表中前者放对象地址,后者放自己地址。所以后者可以改变其值以实现指向对象的改变。
1.3野指针
1.1指向一个已删除的对象/未申请内存的。它不是空的
1.2 产生原因
5
:
- 未初始化,它自己乱指
- free/delete后未置null
- 其操作超出变量的作用域范围
作用域与生命周期是两个完全不同的概念。 在英文中,作用域用“scope”表示,生命周期则用“duration”表示。 作用域是一个静态概念,只在编译源程序的时候用到。 一个标识符的作用域指在源文件中该标识符能够独立地合法出现的区域。 生命周期则是一个运行时(Runtime)概念,它是指一个变量在整个程序从载入到结束运行的过程中存在的时间周期。 由于函数和数据类型是静态的概念,它们没有生命周期的说法,它们从编译、程序的运行到结束整个过程是一直存在的。
参考: cloud.tencent.com/developer/article/1394376
1.4空悬指针
1
指 其指向的内存已经被释放。
解决方法:在离开其作用域时把那块内存释放掉。
*a:左值引用与右值引用
1
’
2
1.因为有些如unique_ptr这种不能copy但是可以移动(因为其有不能共享的资源)的类。减少开销(复制时用的资源)
2.也是别名。利用&&,只能赋其右值(只能在表达式右边[左值则都可以],不可寻址的)
3.通过它来改变右值
值得一提的是,左值的英文简写为“lvalue”,右值的英文简写为“rvalue”。很多人认为它们分别是”left value”、“right value” 的缩写,其实不然。lvalue 是“loactor value”的缩写,可意为存储在内存中、有明确存储地址(可寻址)的数据,而 rvalue 译为 “read value”,指的是那些可以提供数据值的数据(不一定可以寻址,例如存储于寄存器中的数据)。
2
*b:值传递&引用传递
1
形参初始化中 参数传递的类型。形参是引用时,是后者。否则,是把实参的值copy给形参,两者相互独立
2.智能指针
2.1 what&why&here
可避免内存泄露
[*c]
:利用类(智能指针是一个类)的析构函数,在栈里面自动销毁。
头文件提供了智能指针
2.2 类
auto_ptr, unique_ptr, shared_ptr,
weak ptr
比如多线程访问共享对象
6
解决shared_ptr 的循环引用问题
7
*c:内存泄露
3
原来的指针没有释放,它所指向的内存空间被占导致无法被使用,但是已经无法通过这个指针访问到那个内存空间了。
在这个过程中知道手动分配内存是在堆里面,但是返回的引用/指针是在栈里面的。
*d:什么叫没有释放,那么free做了什么
4
把那个内存空间释放掉:告诉OS这个地方可以用。
除此之外,还需要手动把该指针置空,否则会变成野指针
[见1.3]
。
因为它仍然指向那个地址,如果访问,可能已经被分配给其他程序而使其内容发生改变。
Refer:
^1:c++prime 5
^2:
右值引用
^3:
Memory Leak(内存泄漏)问题总结(转)
^4:
free()到底做了什么
^5:
C语言之free函数及野指针
^6:
weak_ptr 的几个应用场景 —— 观察者、解决循环引用、弱回调
^7:
shared_ptr 循环引用问题以及解决办法