千家信息网

C++智能指针使用实例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了C++智能指针使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++智能指针使用实例分析文章都会有所收获,下面我们一起来看看吧。1.简介程序运
千家信息网最后更新 2026年11月02日C++智能指针使用实例分析

这篇文章主要介绍了C++智能指针使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++智能指针使用实例分析文章都会有所收获,下面我们一起来看看吧。

1.简介

程序运行时存在静态空间、栈和堆区,用堆来存储动态分配空间的对象即那些在程序运行时分配空间的对象,若该对象不再使用,我们必须显式的销毁它们,避免内存泄漏。

智能指针是一个可以像指针一样工作的对象,有unique_ptr(独占指针),shared_ptr与weak_ptr等智能指针,定义在头文件中,可以对动态资源进行管理。

保证以构造的对象最终会销毁,即它的析构函数最终会被调用。

注意:

1.为了避免内存泄漏,通过智能指针管理的对象应该没有其他的引用指向它们.

2.智能指针不支持指针的算术运算

2.unique_ptr指针(独占指针)

我们大多数场景下用到的都是unique_ptr。

其在默认情况下和普通指针的大小是相同,内存上没有任何的额外消耗,性能最优。

注意:

1.不能使用其他unique_ptr对象的值来初始化一个unique_ptr。也不能将一个unique_ptr对象赋值给另外一个。这样的操作将导致两个独占指针共享相同对象的所有权。

2.unique_ptr代表的是专属所有权,如果想要把一个unique_ptr的内存交给另外一个unique_ptr对象管理。

只能使用std::move转移当前对象的所有权。转移之后,当前对象不再持有此内存,新的对象将获得专属所有权。

3.若unique_ptr指向的是一个对象数组的话,要确保调用delete[]来处理被解除分配的数组,则应该在对象类型后面包含一对空的方括号[]。

#include#includeusing namespace std;int main() {    unique_ptr up1(new int(11));    cout << "up = " << *up1 << endl;    //将up1的独占权转移给up2,up1不能再操作堆区空间    unique_ptr up2 = std::move(up1);    cout << "up2 = " << *up2 << endl;    //up2.reset();//若为无参作用是显示释放堆区内容    up2.reset(new int(22));//若为有参,先释放原来堆区内容,重新给up2绑定一个新的堆区内容    cout << "up2 = " << *up2 << endl;    //释放控制权,但不释放堆区内存    int* p = up2.release();    cout <<"p = "<< *p << endl;    delete p;    p = nullptr;    return 0;}
#include#includeusing namespace std;int main(){    //指向数组的独占指针    unique_ptr up(new int[5]);    for (int k = 0; k < 5; k++)    {        up[k] = k+1;    }    for (int k = 0; k < 5; k++)    {        cout << up[k] << " ";    }    cout << endl;    return 0;}

3.shared_ptr指针(共享所有权)

多个shared_ptr智能指针可以共同使用同一块堆内存。由于该类型智能指针在实现上采用的是引用计数机制,

即便有一个shared_ptr指针放弃了堆内存的"使用权"(引用计数减1)也不会影响其他指向同一堆内存的shared_ptr指针(只有引用计数为0时,堆内存才会被自动释放)

#include#includeusing namespace std;int main(){    shared_ptr sp1(new int(11));    shared_ptrsp2(sp1);//拷贝构造    cout << "num = " << sp2.use_count() << endl;//打印计数器 2    sp1.reset();    cout << "num = " << sp2.use_count() << endl;//1    cout << *sp2 << endl;//11    sp1.reset();    cout << "num = " << sp1.use_count() << endl;//0    return 0;}

shared_ptr的内存占用是裸指针的两倍。因为除了要管理一个裸指针外,还要维护一个引用计数。 因此相比于unique_ptr, shared_ptr的内存占用更高。

4.weak_ptr(辅助作用)

该类型指针通常不单独使用(没有实际用处),只能和shared_ptr搭配使用。我们可以将weak_ptr视为shared_ptr指针的一种辅助工具。

借助weak_ptr类型指针,我们可以获取shared_ptr指针的一些状态信息,比如有多少指向相同的shared_ptr指针,shared_ptr指针指向的堆内存是否已经被释放等。

当weak_ptr类型指针的指向和某一shared_ptr指针相同时,weak_ptr并不会使所指堆内存的引用计数加1

当weak_ptr指针被释放时,之前所指堆内存的引用计数也不会因此而减1.也就是说,weak_ptr并不会影响所指堆内存空间的引用计数。

weak_ptr模板类中没有重载*和->运算符 , weak_ptr 类型指针只能访问所指的堆内存,而无法修改它

#include#includeusing namespace std;int main(){    shared_ptrsp1(new int(11));    shared_ptrsp2(sp1);    weak_ptrwp = sp1;    cout << wp.use_count() << endl;    shared_ptrsp3 = wp.lock();    //lock() 若当前weak_ptr已经过期,则该函数会返回一个空的shared_ptr指针.反之,该函数返回一个和当前weak_ptr指向相同的shared_ptr。    cout << wp.use_count() << endl;    if (sp3 == nullptr)    {        cout << "堆区空间已经释放" << endl;    }    else    {        //cout << *wp << endl;//err        cout << *sp3 << endl;//间接访问    }    return 0;}

5.自实现初级版智能指针

#includeusing namespace std;class Person{public:    Person(int age)    {        cout << "有参构造函数调用" << endl;        m_age = age;    }    void showage()    {        cout << "年龄为:" << this->m_age << endl;    }    ~Person()    {}    int m_age;};//利用智能指针管理new出来的内存的释放class Smartpoint{public:    Smartpoint(Person* p)    {        this->m_person = p;    }    //重载->运算符    Person* operator->()    {        return this->m_person;    }    //重载*运算符    Person& operator*()    {        return *m_person;    }    ~Smartpoint()    {        if (this->m_person != NULL)        {            //cout << "析构函数调用" << endl;            delete this->m_person;        }    }private:    Person* m_person;};int main(){    Smartpoint sp(new Person(18));    sp->showage();    (*sp).showage();    return 0;}

关于"C++智能指针使用实例分析"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"C++智能指针使用实例分析"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

指针 内存 对象 智能 指向 空间 类型 相同 内容 函数 所有权 实例 实例分析 C++ 分析 所指 管理 运算 数组 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网最新的科技 互联网下的科技发展 金诺互联网科技 互联网最新的科技有限公司 百单互联网科技有限公司 丰台科技园 互联网 深圳卡尔迅互联网科技有限公司怎么样 老年人脱离互联网科技的作文 成都玖崟互联网科技有限公司乐商圈怎么样 来此购互联网科技有限公司 移动互联网年度科技创新 青海科技产业互联网发展 中科明德北京互联网科技 美国互联网科技实力 互联网方面的科技前沿 深圳互联网科技的发展 皮皮虾互联网科技有限公司 广州有谷有贝互联网科技有限公司 山东大美朱楼互联网科技有限公司 互联网的黑科技实验室 百单网互联网科技有限公司怎么样 美国互联网黑科技 青海省互联网新科技 深圳前海聚择互联网科技有限公司 互联网教育科技公司vipkid 北京华百购互联网科技有限公司 互联网数据科技专业 上海科技产业互联网平台 2021互联网科技公司排名 互联网科技创新方面的资料
0