c++实现引用计数
概述
當有指針指向同一塊內存空間時,計數器加1,沒增加一個指向該內存空間的指針,計數器加1,同理,當原本指向該內存空間的指針指向另一塊內存,計數器減1,被指向的另一個內存的計數器加1。下面是一個引用計數的一種實現。
示例
直接上代碼,總共分為三部分,第一部分是基本類的定義,第二部分是對于基本類的使用類,第三部分是實現真正的引用計數功能。
// ReferenceCount.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <stdlib.h> #include <iostream>using namespace std;//基礎對象類 class MyPoint { public:MyPoint(int a = 0,int b = 0):x(a),y(b){}void setPoint(int a,int b){x = a;y = b;}int getX() const {return x;}int getY()const {return y;} private:int x;int y; };//輔助類(共享資源,含有計數和共享的數據資源) class SharePoint {friend class SmartPtr;//友元函數可以訪問類中的私有成員變量SharePoint(MyPoint *p):ptr(p),count(0){}~SharePoint(){if(count == 0){delete ptr;}}MyPoint *ptr;//共享的數據資源int count;//計數 public:int getCount()const{return count;} };//智能指針類 class SmartPtr { public:SmartPtr(MyPoint *p):ptr(new SharePoint(p)){++ptr->count;}SmartPtr(const SmartPtr &p)//拷貝構造函數{ptr = p.ptr;++ptr->count;}SmartPtr & operator=(const SmartPtr &p)//賦值運算符重載{if(this->ptr != p.ptr){if(--ptr->count == 0)//原來指向的內存空間的計數減1{delete ptr;}this->ptr = p.ptr;++p.ptr->count;//新指向的內存空間的計數增加1}return *this;}SharePoint &operator*(){return *ptr;}SharePoint * operator->(){return ptr;}~SmartPtr(){if(ptr->count == 0){delete ptr;}else{--ptr->count;}cout<<"引用計數:"<<ptr->count<<endl;}SharePoint *getSourcePtr(){return ptr;} private:SharePoint *ptr; };//測試引用計數,可以看出引用計數的計數增加于減少 void testReference() {MyPoint p(1,2);SmartPtr s1(&p);cout<<"引用計數的個數:"<<s1.getSourcePtr()->getCount()<<endl;{SmartPtr s2(s1);cout<<"引用計數的個數:"<<s1.getSourcePtr()->getCount()<<endl;{SmartPtr s3 = s2;cout<<"引用計數的個數:"<<s1.getSourcePtr()->getCount()<<endl;}} }int _tmain(int argc, _TCHAR* argv[]) {//以下只能增加引用計數//MyPoint p(1,2);//SmartPtr s1(&p);//cout<<"引用計數的個數:"<<s1.getSourcePtr()->getCount()<<endl;//SmartPtr s2(s1);//cout<<"引用計數的個數:"<<s1.getSourcePtr()->getCount()<<endl;//SmartPtr s3 = s2;//cout<<"引用計數的個數:"<<s1.getSourcePtr()->getCount()<<endl;testReference();system("pause");return 0; }以上代碼是在vs2010上實現的,創建的環境是控制臺程序,自動生成的項目結構如下:
以上僅供參考。
總結
- 上一篇: qt中使窗口的大小随窗口的内容大小进行调
- 下一篇: C/C++ _strlwr_s 函数 –