STL中的auto_ptr是不带有引用计数的,因此一个实体只能被一个auto_ptr对象拥有。由于这样的限制,才会提出auto_ptr在拷贝构造或赋值操作时转移指针所有权的处理方法。向智能指针中添加引用计数可以完全避免“所有权转移”带来的错觉,从而规范指针不安全行为,让智能指针真正Smart。
内建指针和引用计数分别占有一块堆内存,分别用T* ptr和int* pCnt来保存它们的地址。当然,也可以将它们摆放到相邻的位置上,不过这会增加实现的难度,不便于我们理解引用计数的实现。SmartPtr的代码如下所示:
// SmartPtr
template<class T>
class SmartPtr
{
public:
SmartPtr(T* src):ptr(src),pCnt(new int(1))
{
}
SmartPtr(const SmartPtr<T>& src):ptr(src.ptr),pCnt(src.pCnt)
{
++(*pCnt);
}
SmartPtr<T>& operator=(const SmartPtr<T>& rhs)
{
if(ptr != rhs.ptr)
{
Release();
ptr = rhs.ptr;
pCnt = rhs.pCnt;
++*pCnt;
}
return (*this);
}
T* operator->()
{
return ptr;
}
const T* operator->()const
{
return ptr;
}
T& operator*()
{
return (*ptr);
}
const T& operator*()const
{
return (*ptr);
}
~SmartPtr()
{
Release();
}
private:
T* ptr;
int *pCnt;
void Release()
{
if(--*pCnt == 0)
{
delete ptr;
delete pCnt;
}
}
};
在main函数中,编写以下代码进行测试:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include"SmartPtr.h"
class UserInfo
{
public:
UserInfo(const char* strName, const char* strNation)
{
strcpy_s(this->strName,strName);
strcpy_s(this->strNation,strNation);
}
void displayUser()
{
printf_s("我是%s,来自%s\n",strName,strNation);
}
~UserInfo()
{
}
private:
char strName[10];
char strNation[10];
};
int main()
{
UserInfo* pui = new UserInfo("罗纳尔多","巴西");
SmartPtr<UserInfo> tpui(pui);
SmartPtr<UserInfo> tpui2(tpui);
tpui2->displayUser();
tpui = tpui2;
SmartPtr<UserInfo> tpui3(new UserInfo("齐达内","法国"));
tpui2 = tpui3;
tpui2->displayUser();
system("pause");
return 0;
}
输出结果为:
参考资料:
http://www.cublog.cn/u/18517/showart_241240.html
分享到:
相关推荐
该demo主要展现智能指针和引用计数的实现过程,总共两个类,一个智能指针类,一个引用计数类,另外附一份执行步骤资料
C++实现 带引用计数的智能指针 VS2008工程文件
智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(->)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...
采用引用计数的智能指针share_ptr,可以用于标准库容器
混用标准库中的智能指针和引用计数类型的指针示例代码,主要使用了智能指针的Deleter。shared_ptr的Deleter妙用无穷!
智能指针是用来实现指针指向的对象的共享的。其实现的基本思想: 每次创建类的新对象时,初始化指针并将引用计数置为1; 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数; 对一个...
智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与...
智能指针(新版)
C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载) 帮助初学者掌握智能指针的实现原理,采用引用计数方式实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。近花了点时间认真看了智能指针,特地来写这篇文章。 智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行...
因此代码中p的析构函数会被调⽤,引⽤计数从1变成0,通过 new分配的堆内存被释放,这样就避免了内存泄漏的问题 循环引⽤问题 虽然智能指针会减少内存泄漏的可能性,但是如果使⽤智能指针的⽅式不对,⼀样会造成内存...
采用了智能指针技术(没有使用boost库的引用计数型智能指针,而是参考C++沉思录自己实现的),提高了效率,有利于防止内存泄露。个人也建议在看boost库前先看看C++沉思录,大师的经典,对以后很多技术的实现都有影响...
智能指针(smart pointer)是利用个引用计数的策略去处理指针的释放,从而保证指针的安全性。 通常情况下,我们会自己去设计一个智能指针类去管理自己的指针对象。 事实上其原理是存储指向动态分配的指针...
C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能...
智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与...
这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr)。 不想看toy code的读者可以直接拉到文章后看这部分的总结。 shared_ptr shared_ptr 基本用法 shared_...
C++中的智能指针首先出现在“准”标准...shared_ptr是一个引用计数智能指针,用于共享对象的所有权也就是说它允许多个指针指向同一个对象。这一点与原始指针一致。 先来一段简单的代码,看看shared_ptr的简单使用: #
不过系统为我们提供了智能指针,避免出现上述问题,本文将系统地分析Android系统智能指针(轻量级指针、强指针和弱指针)的实现原理。在使用C++来编写代码的过程中,指针使用不当造成内存泄漏一般就是因为new了一个...
智能指针(smartpointer)的一种通用实现技术是使用引用计数(referencecount)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。 每次创建类的新对象时,初始化指针并...
现代的C/C++类库一般会提供智能指针来作为内存管理的折中方案,比如STL的auto_ptr,Boost的Smart_ptr库,QT的QPointer家族,甚至是基于C语言构建的GTK+也通过引用计数来实现类似的功能。Linux内核是如何解决这个问题...