C++ 指针与智能指针

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:

智能指针的三个常用函数:

  1. get() 获取智能指针托管的指针地址(尽量不用)

  2. release() 取消智能指针对动态内存的托管

  3. 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智能指针时,对象交叉使用智能指针而内存泄露的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值