C++循环引用和仿函数的使用_c++ 类循环引用-程序员宅基地

技术标签: struct  C/C++  c语言  namespace  

循环引用
#include <iostream>
#include <memory.h>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
using namespace std;

template<class T>
struct ListNode
{
    ListNode(const T& data)
        :_prev(NULL)
        ,_next(NULL)
        ,_data(data)
    {
        cout<<"ListNode()"<<endl;
    }

    ~ListNode()
    {
        cout<<"~Node()"<<this<<endl;
    }

    shared_ptr<ListNode> _prev;
    shared_ptr<ListNode> _next;
    //weak_ptr<ListNode> _prev;
    //weak_ptr<ListNode> _next;
    T _data;
};

void Test()
{
    //循环引用问题
    shared_ptr<ListNode> p1(new ListNode());
    shared_ptr<ListNode> p2(new ListNode());

    cout<<"p1->Count:"<<p1.use_count()<<endl;
    cout<<"p2->Count:"<<p2.use_count()<<endl;

    p1->_next = p2;//p1节点的_next指向p2节点
    p2->_prev = p1;//p2节点的_prev指向p1节点
    cout<<"p1->Count:"<<p1.use_count()<<endl;
    cout<<"p2->Count:"<<p2.use_count()<<endl;
}
使用shared_ptr时,由于节点之间的相互引用使得多个节点指向同一块空间,引用计数count不为1。在释放空间时,p1等待p2释放,而p2又在等待p1的释放,从而引起循环引用问题,造成内存泄漏。
仿函数:也叫函数对象。就是使一个类的使用看上去像一个函数。其实现原理就是就是在类中重载(),这个类就有了类似函数的行为,同时也成为一个仿函数类了
下面两个仿函数的使用例子
定制删除器
#include <iostream>
using namespace std;

template<class T>
struct Delete
{
    void operator ()(T* p)
    {
        delete(p);
        cout<<"Delete"<<endl;
    }
};

template<class T>
struct Free
{
    void operator ()(T* p)
    {
        free(p);
        cout<<"Free"<<endl;
    }
};

template<class T>
struct Fclose
{
    void operator ()(T* p)
    {
        fclose(p);
        cout<<"Fclose"<<endl;
    }
};

template<class T, class Del = Del<T>>
class SharedPtr
{
public:
    SharedPtr(T* p =NULL)
        :_p(p)
        ,_pcount(NULL)
    {
        if(_p)
            _pcount = new int(1);
    }

    SharedPtr(const SharedPtr<T, Del>& sp)
        :_p(sp._p)
        ,_pcount(sp._pcount)
    {
        (*sp._pcount)++;
    }

    SharedPtr<T, Del>& operator =(const SharedPtr<T, Del>& sp)
    {
        if(this != &sp)
        {
            Release();

            _p = sp._p;
            _pcount = sp._pcount;
            (*sp._pcount)++;
        }
        return *this;
    }

    ~SharedPtr()
    {
        Release();
    }

    T& operator *()
    {
        return *_p;
    }

    T* operator ->()
    {
        return _p;
    }
private:
    void Release()
    {
        if(_p && (--(*_pcount)) == 0)
        {
            Del()(_p);

            delete _pcount;
            _pcount = NULL;
        }
    }

    T* _p;
    int* _pcount;
};

int main()
{
    SharedPtr<int, Free<int>> sp1((int*)malloc(sizeof(int)));
    SharedPtr<int, Delete<int>> sp2(new int(1));
    SharedPtr<FILE, Fclose<FILE>> sp3(fopen("test.txt", "wb"));
}

这里写图片描述

多重冒泡排序
#include <iostream>
using namespace std;

template<class T>
struct Great//升序
{
    bool operator ()(T& left, T& right)
    {
        return left > right;
    }
};

template<class T>
struct Less//降序
{
    bool operator ()(T& left, T& right)
    {
        return left > right;
    }
};

template<class T, class Compare>
void BubbleSort(T arr[], int len)
{
    int i = 0;
    int j = 0;
    int flag = 0;

    for(i = 0; i < len-1; i++)
    {
        flag = 0;
        for(j = 0; j < len-1-i; j++)
        {
            if(Compare()(arr[j], arr[j+1]))
            {
                flag = 1;
                swap(arr[j], arr[j+1]);
            }
        }
        if(flag == 0)
            break;
    }
}

int main()
{
    int arr1[] = {
   3, 7, 5, 2, 1, 9, 6, 4, 8};
    int len1 = sizeof(arr1)/sizeof(arr1[0]);
    BubbleSort<int, Great<int>>(arr1, len1);

    int arr2[] = {
   3, 7, 5, 2, 1, 9, 6, 4, 8};
    int len2 = sizeof(arr2)/sizeof(arr2[0]);
    BubbleSort<int, Less<int>>(arr2, len2);

    return 0;
}

这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_35452533/article/details/77349498

智能推荐

php网上书城|基于PHP实现网上书店商城藉项目_书店项目商城代码-程序员宅基地

文章浏览阅读222次,点赞2次,收藏3次。本网上书店是针对目前网上书店的实际需求,从实际工作出发,对过去的网上书店存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,借助php编程语言、php技术、mysql数据库和apache服务器来完成系统的所有功能 。本网上书店主要包括系统用户管理模块、新闻文章管理模块、图书信息管理、商城订单管理、登录模块、和退出模块等多个模块。它帮助网上书店实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了网上书店数据资源,有效的减少了网上书店_书店项目商城代码

高通平台Camera Dtsi解析_csiphy-sd-index-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏19次。参考文件:Documentation/devicetree/bindings/media/video/msm-cam-cci.txtqcom,cam-sensor@0 { /*摄像头唯一区分标志,添加新的camera,该ID顺次加1,通过该ID会与camera_config.xml里的ID匹配,这样才会去加载该ID对应模组的驱动。*/ cell-index = <0>; /*匹配节点,驱动和设备的compatible属性相同时,才会调用probe函数。*/ _csiphy-sd-index

webworker应用场景_Web Workers 的使用场景有哪些-程序员宅基地

文章浏览阅读3.6k次。以前我们总说,JS是单线程没有多线程,当JS在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验,从而需要设置把任务放在任务队列中;执行任务队列中的任务也并非多线程进行的,然而现在HTML5提供了我们前端开发这样的能力 - Web Workers API,我们一起来看一看 Web Worker 是什么,怎么去使用它,在实际生产中如何去用它来进行产出。1. 概述Web Worker..._webworker使用场景

elasticsearch-5.5.2启动失败报错:max number of threads [1024] for user [lishang] likely too low_max number of threads [1024] for user [work] is to-程序员宅基地

文章浏览阅读1.4w次,点赞4次,收藏12次。错误提示:ERROR: [1] bootstrap checks failed [1]: max number of threads [1024] for user [elasticsearch] is too low, increase to at least [2048]错误原因:启动检查未通过 elasticsea..._max number of threads [1024] for user [work] is too low, increase to at leas

李嘉诚又“跑路”?卖了一代“地王”,大赚38亿!-程序员宅基地

文章浏览阅读201次。李嘉诚又有新动作了!7月23日晚,李嘉诚家族名下的长实集团发布公告称,以总价约71.02亿元(约10.12亿美元)价格,把旗下成都“南城都汇”项目,卖给“禹洲集团”和“成都瑞卓置业有限公司”,两家房企一人一半(各占50%股权);而李嘉诚将从中“赚”(未经审核收益)约38.11亿元。李嘉诚71亿卖掉成都“地王”7月23日晚,李嘉诚旗下公司长实集团发布了一则公告。公告称,由长实集团子公司所持有的成都南城都汇项目卖了,接盘方为一家名为RZ3262019 Limited的公司,股东分别为禹州集团控股有限公司

层次分析法详解(AHP),python代码,楼盘综合水平评价算法_pycharm ahp-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏42次。该文章讲述了多层次分析法代码讲解,以及如何应用到楼盘综合水平分析当中_pycharm ahp

随便推点

马上过年了,5行代码教你实现放烟花_fireworks.js频率高点-程序员宅基地

文章浏览阅读1.6k次。直接上代码吧<!DOCTYPE html><html lang="zh"><head><title>Fireworks</title></head><body> <div class="firework-container" ></div> <script src="./js/js/jquery-1.11.0.min.js"></script> <sc_fireworks.js频率高点

o.a.c.c.C.[.[localhost].[/].[dispatcherServlet]】: Servlet.service() for servlet [dispatcherServlet]_09:43:03.302 [http-nio-9300-exec-3] error o.a.c.c.-程序员宅基地

文章浏览阅读126次。导致报错原因是?不能实例化;去除就ok了。_09:43:03.302 [http-nio-9300-exec-3] error o.a.c.c.c.[.[.[.[dispatcherservlet

「转」101个著名的心理效应_择优选择是什么效应-程序员宅基地

文章浏览阅读1.1w次,点赞3次,收藏16次。目录1-101、阿基米德与酝酿效应2、阿伦森效应3、安泰效应4、暗示效应5、安慰剂效应6、巴纳姆效应7、巴霖效应8、半途效应9、贝尔纳效应10、贝勃规律11-2011、比马龙效应,期望效应,罗森塔尔效应12、彼得原理13、帕金森定律14、边际效应15、波纹效应16、布里丹毛驴效应17、不值得定律18、超限效应..._择优选择是什么效应

mac 下typora 转 word PDF_mac版本的typora怎么导出pdf-程序员宅基地

文章浏览阅读489次。mac 下typora 转 word _mac版本的typora怎么导出pdf

ubuntu安装bochs遇到的问题_致命错误: gtk/gtk.h:没有那个文件或目录-程序员宅基地

文章浏览阅读1.3k次。gtk_enh_dbg_osdep.cc:20:21: 致命错误: gtk/gtk.h:没有那个文件或目录编译中断解决方法:sudo apt-get install libgtk2.0-devsudo make dist-clean 一定要清除干净sudo ./configure --enable-debugger --enable-disasmsudo make_致命错误: gtk/gtk.h:没有那个文件或目录

【系统分析师】8.计算机组成和体系结构_2的-100阶码-程序员宅基地

文章浏览阅读244次。计算机组成和体系结构 浮点数 表示:尾数*基数的指数次方,2的-100 次方*5,5就是尾数,-100就是指数(阶码) 尾数,用尾码存储,标识数值,和数值的正负 指数,用阶码存储,标识精度,指数的正负 尾数决定精度(1.123456 就比 1.2 精度搞),指数决定范围(2的1次方 就没..._2的-100阶码