6.Boost之smartpointer

简介:  1自己实现一个智能指针的功能 #include <iostream> #include <string> #include <vector> #include <algorithm> #include <functional> #include <stdlib.h&


1自己实现一个智能指针的功能

#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

#include <functional>

#include <stdlib.h>

 

using namespace std;

 

template<class T>

class pmy

{

public:

    pmy()

    {}

    pmy(T *t)

    {

        p = t;

    }

    ~pmy()

    {

        if (p != nullptr)

        {

            delete p;

        }

    }

    T operator *()

    {

        return *p;

    }

 

private:

    T *p = nullptr;

};

 

class Test

{

public:

    Test()

    {

        cout << "Test  create" << endl;

    }

    ~Test()

    {

        cout << "Testdelete"<< endl;

    }

};

 

void run()

{

    pmy<Test> p(new Test);//智能指针,智能释放

    //*p;

}

 

void main()

{

    run();

    cin.get();

}

运行结果:

2.boost:scoped_ptr智能指针,独占内存,并且会自动释放内存,也就是说这片内存不用共享给别人用的时候可以用这个智能指针

#include <iostream>

#include <boost/scoped_ptr.hpp>

//#include<boost/scoped_array.hpp>

//#include<boost/shared_ptr.hpp>

//#include<boost/shared_array.hpp>

//#include<boost/weak_ptr.hpp>

//#include<windows.h>

 

using namespace std;

 

void main()

{

    //scoped_ptr(作用于指针,特点是独享)就是一个智能指针

    //p用(new int)来初始化

    boost::scoped_ptr<int> p(new int);//自动释放内存

    *p = 12;

    //get()获取指针指向的内容

    cout << *p.get() << endl;

    //reset()的作用是将原来的内存空间自动释放

    p.reset(new int);

    *p.get() = 3;

    //独占内存,也可以用nullptr的方式进行初始化

    boost::scoped_ptr<int> pA(nullptr);

    cout << *p.get() << endl;

 

    cin.get();

    //运行结果:

    //12

    //3

}

2. boost::scoped_array,通过它来智能管理数组

#include <iostream>

//#include<boost/scoped_ptr.hpp>

#include <boost/scoped_array.hpp>

//#include<boost/shared_ptr.hpp>

//#include<boost/shared_array.hpp>

//#include<boost/weak_ptr.hpp>

//#include<windows.h>

 

using namespace std;

 

void main()

{

    //某些情况下可以用作用域数组:管理数组比较方便,可以有效的释放数组

    //同样会自动释放数组

    boost::scoped_array<int> p(new int[10]);

    //下面的方式是错的,因为这个指针是独享的,不可以共享给别的指针

    //boost::scoped_array<int> pA(p);

   

    *p.get() = 1;

    p[3] = 2;

    //结果为2

    cout << p[3] << endl;

    //重新分配内存,这种指针独享指针,自动释放内存

    p.reset(new int[5]);

 

    cin.get();

}

3.共享指针boost::shared_ptr

#include <iostream>

#include <vector>

//#include<boost/scoped_ptr.hpp>

//#include<boost/scoped_array.hpp>

#include <boost/shared_ptr.hpp>

#include <boost/shared_array.hpp>

#include <algorithm>

//#include<boost/weak_ptr.hpp>

//#include<windows.h>

 

using namespace std;

 

//boost::shared_ptr<int>p共享一个指针

void show(boost::shared_ptr<int> p)

{

    cout << *p << endl;

}

 

 

void main()

{

    vector<boost::shared_ptr<int>> v;

    boost::shared_ptr<int> p1(new int(11));

    boost::shared_ptr<int> p2(new int(12));

    boost::shared_ptr<int> p3(p2);//拷贝

 

    v.push_back(p1);

    v.push_back(p2);

    v.push_back(p3);

 

    for_each(v.begin(),v.end(),show);

 

    cin.get();

    //运行结果:

    //11

    //12

    //12

}

4. boost::shared_array,共享指针数组

#include <iostream>

#include <vector>

//#include<boost/scoped_ptr.hpp>

//#include<boost/scoped_array.hpp>

#include <boost/shared_ptr.hpp>

#include <boost/shared_array.hpp>

#include <algorithm>

//#include<boost/weak_ptr.hpp>

//#include<windows.h>

 

using namespace std;

 

class runclass

{

public:

    int  i = 0;

public:

    runclass(int num) :i(num)

    {

        cout << "i create" << i << endl;

    }

    runclass()

    {

        cout << "i create" << i << endl;

    }

    ~runclass()

    {

        cout << "i delete" << i << endl;

    }

    void print()

    {

        cout << "i =" << i << endl;

    }

};

 

void testfun()

{

    boost::shared_ptr<runclass>  p1(new runclass(10));

    boost::shared_ptr<runclass>  p2(p1);  //浅拷贝

    boost::shared_ptr<runclass>  p3(p1);

 

    p1.reset(new runclass(12));

    p1->print();

    p2->print();

    p3->print();

}

 

void testfunarray()

{

    boost::shared_array<runclass> p1(new runclass[5]);

    boost::shared_array<runclass> p2(p1);

}

 

void main()

{

    testfun();

 

    cout << "--------" << endl;

 

    testfunarray();

 

    cin.get();

}

运行指针:

5.弱指针(协助共享指针的管理)

#include <iostream>

//#include<vector>

//#include<boost/scoped_ptr.hpp>

//#include<boost/scoped_array.hpp>

#include <boost/shared_ptr.hpp>

//#include<boost/shared_array.hpp>

//#include<algorithm>

#include<boost/weak_ptr.hpp>

#include <windows.h>

 

using namespace std;

 

//DWORD在:#include<windows.h>,其本质是unsignedlong

DWORD  WINAPI reset(LPVOID p)

{

    boost::shared_ptr<int > *sh = static_cast<boost::shared_ptr<int > *> (p);

    sh->reset();//指针的重置,释放内存

    std::cout << "指针执行释放" << endl;

    return 0;

}

 

DWORD WINAPI print(LPVOID p)

{

    boost::weak_ptr<int > * pw = static_cast<boost::weak_ptr<int > *>(p);

    boost::shared_ptr<int > sh = pw->lock();//锁定不可以释放

    Sleep(5000);

    if (sh)

    {

        std::cout << *sh << endl;

    }

    else

    {

        std::cout << "指针已经被释放" << endl;

    }

 

    return 0;

}

 

void main()

{

    boost::shared_ptr<int> sh(new int(99));

    boost::weak_ptr<int > pw(sh);

    HANDLE threads[2];

    threads[0] = CreateThread(0, 0, reset, &sh, 0, 0);//创建一个线程

    threads[1] = CreateThread(0, 0, print, &pw, 0, 0);

    Sleep(1000);

 

    WaitForMultipleObjects(2, threads, TRUE, INFINITE);//等待线程结束

    cin.get();

}

运行结果:

指针执行释放

 
目录
相关文章
|
3天前
|
人工智能 运维 安全
|
1天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
人工智能 JavaScript 测试技术
Qwen3-Coder入门教程|10分钟搞定安装配置
Qwen3-Coder 挑战赛简介:无论你是编程小白还是办公达人,都能通过本教程快速上手 Qwen-Code CLI,利用 AI 轻松实现代码编写、文档处理等任务。内容涵盖 API 配置、CLI 安装及多种实用案例,助你提升效率,体验智能编码的乐趣。
765 109
|
2天前
|
机器学习/深度学习 传感器 算法
Edge Impulse:面向微型机器学习的MLOps平台——论文解读
Edge Impulse 是一个面向微型机器学习(TinyML)的云端MLOps平台,致力于解决嵌入式与边缘设备上机器学习开发的碎片化与异构性难题。它提供端到端工具链,涵盖数据采集、信号处理、模型训练、优化压缩及部署全流程,支持资源受限设备的高效AI实现。平台集成AutoML、量化压缩与跨硬件编译技术,显著提升开发效率与模型性能,广泛应用于物联网、可穿戴设备与边缘智能场景。
171 127
|
3天前
|
算法 Python
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
【轴承故障诊断】一种用于轴承故障诊断的稀疏贝叶斯学习(SBL),两种群稀疏学习算法来提取故障脉冲,第一种仅利用故障脉冲的群稀疏性,第二种则利用故障脉冲的额外周期性行为(Matlab代码实现)
230 152
|
5天前
|
Java 数据库 数据安全/隐私保护
Spring 微服务和多租户:处理多个客户端
本文介绍了如何在 Spring Boot 微服务架构中实现多租户。多租户允许单个应用实例为多个客户提供独立服务,尤其适用于 SaaS 应用。文章探讨了多租户的类型、优势与挑战,并详细说明了如何通过 Spring Boot 的灵活配置实现租户隔离、动态租户管理及数据源路由,同时确保数据安全与系统可扩展性。结合微服务的优势,开发者可以构建高效、可维护的多租户系统。
210 127
|
4天前
|
机器学习/深度学习 存储 资源调度
CMSIS-NN:ARM Cortex-M处理器的高效神经网络内核——论文解读
CMSIS-NN是专为ARM Cortex-M系列微控制器优化的神经网络计算内核库,旨在支持资源受限的物联网边缘设备进行高效的深度学习推理。该库通过对卷积、池化、全连接层等关键操作进行定点量化、SIMD指令优化和内存布局调整,显著提升了模型在嵌入式设备上的运行效率。实验表明,CMSIS-NN在Cortex-M7处理器上的推理速度比基准实现提升了近5倍,大幅降低了功耗,为边缘AI应用提供了可行的技术路径。
224 128