NULL,nullptr,0
参考:
c/c++中的NULL,nullptr,0__ 菜 -∞的博客-CSDN博客
C++ 智能指针 - 全部用法详解_cpp_learners的博客-CSDN博客_c++ 智能指针使用
【C++】智能指针详解_Billy12138的博客-CSDN博客_智能指针
一、空指针
1.释放内存表示指针指像的内存不被本程序占用,系统可以重新使用该内存。
指针变量所指的地址事不变的,只是不被该程序使用。
2.
C语言中:
#undef NULL
#define NULL ((void *)0)//强制类型转换,(C中0表示的含义比较多)
其中void*是无类型指针,其他任何指针都可以直接赋值给它。
3.
C++ 编译器:
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)//void*不支持C++的隐式类型转换(C也有,但是C++多了自定义的类)
4.
下面的C++重载,如果赋值null和赋值0是一样的:
void func(int);
void func(char *);
NULL,本身应该是一个指针的类型,但是在实际调用中却会变成数据类型,这和指针类型发生了二义性。
5.
C++11 引⼊了 nullptr 关键字,专⻔⽤来区分空指针、0
--------------------------------------------------------------------------------------------------------------------------------
二、智能指针
1.
shared_ptr:允许多个指针指向同一个对象。
unique_ptr:则“独占”所指向的对象(俩个指针不能指向同一资源)。
weak_ptr:伴随类,弱引用,指向shared_ptr所管理的对象。
2.shared_ptr:
智能指针的三个常用函数:
-
get() 获取智能指针托管的指针地址(尽量不用)
-
release() 取消智能指针对动态内存的托管
-
reset() 重置智能指针托管的内存地址,如果地址不一致,原来的会被析构掉
p = new int(1024);//错误:不能将一个指针赋予shared_ptr。
p.reset(new int(1024));//正确。p指向一个新对象。
3.unique_ptr:
unique_ptr<string> p2(p1.release());//p2被初始化为p1原来保存的指针,而p1被置为空。
unique_ptr<string>p3(new string("Trex"));
p2.reset(p3.release());//reset释放了p2原来指向的内存,再初始化为p3,p3置空。
不可以左值赋值,可以使用move()进行移动。
unique_ptr<Test> t7(new Test);
unique_ptr<Test> t8(new Test);
t7 = std::move(t8); // 必须使用移动语义,结果,t7的内存释放,t8的内存交给t7管理
t7->doSomething();
4.weak_ptr:
weak_ptr 只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。 同时weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象。
这个可以解决在使用shared_ptr智能指针时,对象交叉使用智能指针而内存泄露的情况。