栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 指针与智能指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 p2(p1.release());//p2被初始化为p1原来保存的指针,而p1被置为空。


unique_ptrp3(new string("Trex"));
p2.reset(p3.release());//reset释放了p2原来指向的内存,再初始化为p3,p3置空。

不可以左值赋值,可以使用move()进行移动。

unique_ptr t7(new Test);
unique_ptr 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智能指针时,对象交叉使用智能指针而内存泄露的情况。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929173.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号