`
tempsitegoogle
  • 浏览: 866691 次
文章分类
社区版块
存档分类
最新评论

带引用计数的智能指针

 
阅读更多

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++实现 带引用计数的智能指针

    C++实现 带引用计数的智能指针 VS2008工程文件

    smartptr——基于自动引用计数的智能指针

    智能指针相信大家听说过吧,我理解的智能指针,既是一个C++模板类,重载了指针操作符(-&gt;)和(*)操作符,而使它的实例可以"用指针的形式去调用"。 它可以接管任意类型的指针,所以你只需要放心大胆的new出任意对象...

    采用引用计数的智能指针share_ptr

    采用引用计数的智能指针share_ptr,可以用于标准库容器

    混用智能指针和引用计数类型的指针示例

    混用标准库中的智能指针和引用计数类型的指针示例代码,主要使用了智能指针的Deleter。shared_ptr的Deleter妙用无穷!

    c++智能指针的实现

    智能指针是用来实现指针指向的对象的共享的。其实现的基本思想: 每次创建类的新对象时,初始化指针并将引用计数置为1; 当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数; 对一个...

    C++智能指针实现

    智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与...

    智能指针(新版)

    智能指针(新版)

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载)

    C++智能指针实现(包含拷贝构造,赋值函数,引用解引用重载) 帮助初学者掌握智能指针的实现原理,采用引用计数方式实现

    C++ 引用计数技术及智能指针的简单实现

    一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧)。近花了点时间认真看了智能指针,特地来写这篇文章。  智能指针是什么  简单来说,智能指针是一个类,它对普通指针进行...

    C++智能指针循环引用问题分析.pdf

    因此代码中p的析构函数会被调⽤,引⽤计数从1变成0,通过 new分配的堆内存被释放,这样就避免了内存泄漏的问题 循环引⽤问题 虽然智能指针会减少内存泄漏的可能性,但是如果使⽤智能指针的⽅式不对,⼀样会造成内存...

    基于遗传算法的排课系统,含论文(排课 遗传算法 设计模式 智能指针 报表)

    采用了智能指针技术(没有使用boost库的引用计数型智能指针,而是参考C++沉思录自己实现的),提高了效率,有利于防止内存泄露。个人也建议在看boost库前先看看C++沉思录,大师的经典,对以后很多技术的实现都有影响...

    C++在设计和使用智能指针

     智能指针(smart pointer)是利用个引用计数的策略去处理指针的释放,从而保证指针的安全性。  通常情况下,我们会自己去设计一个智能指针类去管理自己的指针对象。  事实上其原理是存储指向动态分配的指针...

    【C++ 深入浅出】智能指针shared_ptr、unique_ptr、weak_ptr详解

    C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能...

    C++中智能指针如何设计和使用

    智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与...

    C++11新特性之智能指针

    这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr)。  不想看toy code的读者可以直接拉到文章后看这部分的总结。  shared_ptr  shared_ptr 基本用法  shared_...

    C++11 智能指针之shared_ptr代码详解

    C++中的智能指针首先出现在“准”标准...shared_ptr是一个引用计数智能指针,用于共享对象的所有权也就是说它允许多个指针指向同一个对象。这一点与原始指针一致。 先来一段简单的代码,看看shared_ptr的简单使用: #

    Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析

    不过系统为我们提供了智能指针,避免出现上述问题,本文将系统地分析Android系统智能指针(轻量级指针、强指针和弱指针)的实现原理。在使用C++来编写代码的过程中,指针使用不当造成内存泄漏一般就是因为new了一个...

    C++智能指针的设计和实现

     智能指针(smartpointer)的一种通用实现技术是使用引用计数(referencecount)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。  每次创建类的新对象时,初始化指针并...

    Linux 内核里的“智能指针”

    现代的C/C++类库一般会提供智能指针来作为内存管理的折中方案,比如STL的auto_ptr,Boost的Smart_ptr库,QT的QPointer家族,甚至是基于C语言构建的GTK+也通过引用计数来实现类似的功能。Linux内核是如何解决这个问题...

Global site tag (gtag.js) - Google Analytics