带引用计数的智能指针

#define DbgPrint(...) printf(__VA_ARGS__)
#define DbgEnter() {DbgPrint("+%s/n",__FUNCSIG__);DbgPrint("+pointer_=0x%x,refcount_=0x%x,*refcount_=0x%x/n",pointer_,refcount_,refcount_==0?0:*refcount_);}
#define DbgLeave() {DbgPrint("+pointer_=0x%x,refcount_=0x%x,*refcount_=0x%x/n",pointer_,refcount_,refcount_==0?0:*refcount_);DbgPrint("-%s/n",__FUNCSIG__);}
//带引用计数的智能指针
template<typename T>
class XSharedPointer
{
public:
XSharedPointer();
XSharedPointer(T
* t);
XSharedPointer(
const XSharedPointer<T>& t);
virtual ~XSharedPointer();
T
& operator*();
T
* operator->();
XSharedPointer
<T>& operator=(const XSharedPointer<T>& t);
XSharedPointer
<T>& operator=(const T* t);
void clear();
protected:
private:
T
* pointer_;
unsigned
int* refcount_;
};
template
<typename T>
XSharedPointer
<T>::XSharedPointer():refcount_(0),pointer_(0)
{
DbgEnter();
pointer_
=0;
refcount_
=0;
DbgLeave();
}

template
<typename T>
XSharedPointer
<T>::XSharedPointer(T* t):refcount_(0),pointer_(0)
{
DbgEnter();
pointer_
=t;
if (t!=0)
{
refcount_
=new unsigned int(1);
}
else
{
refcount_
=0;
}
DbgLeave();
}

template
<typename T>
XSharedPointer
<T>::XSharedPointer(const XSharedPointer<T>& t):refcount_(0),pointer_(0)
{
DbgEnter();
pointer_
=t.pointer_;
refcount_
=t.refcount_;
if (refcount_!=0)
{
(
*refcount_)++;
}
DbgLeave();
}

template
<typename T>
XSharedPointer
<T>::~XSharedPointer()
{
DbgEnter();
//引用计数-1;若==1则删除指针
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
pointer_
=0;
refcount_
=0;
}
DbgLeave();
}

template
<typename T>
T
& XSharedPointer<T>::operator *()
{
DbgEnter();
DbgLeave();
return *pointer_;
}
template
<typename T>
T
* XSharedPointer<T>::operator ->()
{
DbgEnter();
DbgLeave();
return pointer_;
}
template
<typename T>
XSharedPointer
<T>& XSharedPointer<T>::operator=(const XSharedPointer<T>& t)
{
DbgEnter();
if (&t==this)
{
return *this;
}
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
pointer_
=0;
refcount_
=0;
}
refcount_
=t.refcount_;
if (refcount_!=0)
{
(
*refcount_)++;
}
pointer_
=t.pointer_;
DbgLeave();
return *this;
}
template
<typename T>
XSharedPointer
<T>& XSharedPointer<T>::operator =(const T* t)
{
DbgEnter();
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
pointer_
=0;
refcount_
=0;
}
refcount_
=new int(1);
pointer_
=t;
DbgLeave();
return *this;
}
/* 清除共享指针 */
template
<typename T>
void XSharedPointer<T>::clear()
{
DbgEnter();
if (refcount_!=0&&(*refcount_)--==1)
{
delete pointer_;
delete refcount_;
}
pointer_
=0;
refcount_
=0;
DbgLeave();
}

  

转载于:https://www.cnblogs.com/oyjj/archive/2011/05/11/2132871.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个引用计数智能指针的类模版的示例代码: ```c++ template<typename T> class SmartPtr { public: SmartPtr() : ptr(nullptr), refCount(new int(0)) {} explicit SmartPtr(T* p) : ptr(p), refCount(new int(1)) {} SmartPtr(const SmartPtr<T>& other) : ptr(other.ptr), refCount(other.refCount) { ++(*refCount); } SmartPtr<T>& operator=(const SmartPtr<T>& other) { if (this != &other) { if (--(*refCount) == 0) { delete ptr; delete refCount; } ptr = other.ptr; refCount = other.refCount; ++(*refCount); } return *this; } ~SmartPtr() { if (--(*refCount) == 0) { delete ptr; delete refCount; } } T& operator*() const { return *ptr; } T* operator->() const { return ptr; } int getRefCount() const { return *refCount; } private: T* ptr; int* refCount; }; ``` 这个类模版定义了一个智能指针类 `SmartPtr`,它可以自动释放各种类对象指针,并且支持引用计数。其中, `ptr` 是指向实际对象的指针, `refCount` 是指向引用计数的指针。 在 `SmartPtr` 的构造函数中,我们将引用计数初始化为 0,表示当前没有任何指针引用该对象。当我们使用 `SmartPtr` 类模版创建一个实例时,我们可以传入一个指向实际对象的指针,此时我们会将引用计数初始化为 1。当我们将这个实例复制给另一个实例时,我们需要增加引用计数。当我们销毁一个实例时,我们需要将引用计数减少,如果引用计数归零,我们需要释放实际对象并销毁引用计数。 以下是一个使用 `SmartPtr` 类模版的例子: ```c++ #include <iostream> #include <string> using namespace std; class Person { public: Person(const string& n) : name(n) { cout << "Person " << name << " is created." << endl; } ~Person() { cout << "Person " << name << " is destroyed." << endl; } void sayHello() { cout << "Hello, I'm " << name << "." << endl; } private: string name; }; int main() { SmartPtr<Person> p1(new Person("Alice")); SmartPtr<Person> p2(new Person("Bob")); SmartPtr<Person> p3(p1); SmartPtr<Person> p4 = p2; cout << p1->getRefCount() << endl; cout << p2->getRefCount() << endl; cout << p3->getRefCount() << endl; cout << p4->getRefCount() << endl; p1 = p2; cout << p1->getRefCount() << endl; cout << p2->getRefCount() << endl; cout << p3->getRefCount() << endl; cout << p4->getRefCount() << endl; return 0; } ``` 在这个例子中,我们定义了一个 `Person` 类,它包含一个字符串类型的名字成员和一个 `sayHello` 方法。我们使用 `SmartPtr` 类模版创建了四个指向 `Person` 对象的智能指针实例,分别为 `p1`、`p2`、`p3` 和 `p4`。在创建 `SmartPtr` 实例时,我们传入了一个指向 `Person` 对象的指针,并且 `SmartPtr` 类模版自动增加了引用计数。 在程序的后面,我们将 `p1` 赋值为 `p2`,此时 `p1` 原本指向的 `Person` 对象将被释放,引用计数减少到 1。我们可以通过调用 `getRefCount` 方法获取当前引用计数的值。最后,我们将所有的 `SmartPtr` 实例销毁,它们所指向的 `Person` 对象也将被自动释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值