C++ 引用计数(reference count) 实现智能指针
2015-11-24 00:10
465 查看
前面说到,含有指针成员的类容易出现悬垂指针的问题,特别是类的对象有复制,赋值等行为时;
referecen count 的核心思维是,使用一个计数器来标识当前指针指向的对象被多少类的对象所使用,即记录指针指向对象被引用的次数;
构造函数中创建类的新对象时,初始化引用计数为1;
复制构造函数复制指针,并使相应的引用计数增加1;
赋值操作减少左操作数所值对象的引用计数,增加右操作数所指对象的引用计数;
析构函数使引用计数减少1,并且当引用计数为1时,释放指针说指向的对象;
使用引用计数实现智能指针的关键是,引用计数应该存在哪里
引用计数应该是某个类对象和其复制对象共享的, 而指针成员恰好有这样的特性, 故可以在类中多声明一个int * 的成员,用来表示引用计数
以下代码很好的解释了什么是引用计数:
//////////////////////////////////////////////////
/* */
//////////////////////////////////////////////////
#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>
#include <list>
#include <string>
#include <vector>
#include <set>
class HasPtr
{
public:
//constructor
HasPtr(int *p,int i):ptr(p),val(i),pCount(new int) { *pCount = 1;}
//copy control
HasPtr(HasPtr & h):ptr(h.ptr),val(h.val),pCount(h.pCount) { ++(*pCount) ;}
HasPtr& operator=(HasPtr& );
~HasPtr();
void print_reference_count() { std::cout<<"shared object used times: "<<*pCount<<std::endl; }
int * get_prt() const {return ptr;}
int get_int() const { return val; }
void set_ptr(int *p) { ptr =p;}
void set_int(int i) {val = i;}
int get_ptr_val() const { return *ptr;}
void set_ptr_val(int val) { *ptr = val;}
private:
int * ptr;
int val;
//reference count members
int * pCount;
};
HasPtr& HasPtr::operator= (HasPtr& h)
{
ptr = h.ptr;
val = h.val;
++(*(h.pCount));
--(*pCount);
pCount = h.pCount;
return *this;
}
HasPtr::~HasPtr()
{
--(*pCount);
if(0 == (*pCount))
{
delete ptr;
delete pCount;
}
}
int main()
{
int* p = new int(42);
HasPtr test(p,50);
test.print_reference_count();
HasPtr test2(p,60);
test2.print_reference_count();
HasPtr test3(test);
test.print_reference_count();
test3.print_reference_count();
test2 = test3;
test.print_reference_count();
test3.print_reference_count();
test2.print_reference_count();
return 0;
}
int *pCount 是指向引用计数的指针;
实现引用计数还有其他的方式
//待补充
referecen count 的核心思维是,使用一个计数器来标识当前指针指向的对象被多少类的对象所使用,即记录指针指向对象被引用的次数;
构造函数中创建类的新对象时,初始化引用计数为1;
复制构造函数复制指针,并使相应的引用计数增加1;
赋值操作减少左操作数所值对象的引用计数,增加右操作数所指对象的引用计数;
析构函数使引用计数减少1,并且当引用计数为1时,释放指针说指向的对象;
使用引用计数实现智能指针的关键是,引用计数应该存在哪里
引用计数应该是某个类对象和其复制对象共享的, 而指针成员恰好有这样的特性, 故可以在类中多声明一个int * 的成员,用来表示引用计数
以下代码很好的解释了什么是引用计数:
//////////////////////////////////////////////////
/* */
//////////////////////////////////////////////////
#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>
#include <list>
#include <string>
#include <vector>
#include <set>
class HasPtr
{
public:
//constructor
HasPtr(int *p,int i):ptr(p),val(i),pCount(new int) { *pCount = 1;}
//copy control
HasPtr(HasPtr & h):ptr(h.ptr),val(h.val),pCount(h.pCount) { ++(*pCount) ;}
HasPtr& operator=(HasPtr& );
~HasPtr();
void print_reference_count() { std::cout<<"shared object used times: "<<*pCount<<std::endl; }
int * get_prt() const {return ptr;}
int get_int() const { return val; }
void set_ptr(int *p) { ptr =p;}
void set_int(int i) {val = i;}
int get_ptr_val() const { return *ptr;}
void set_ptr_val(int val) { *ptr = val;}
private:
int * ptr;
int val;
//reference count members
int * pCount;
};
HasPtr& HasPtr::operator= (HasPtr& h)
{
ptr = h.ptr;
val = h.val;
++(*(h.pCount));
--(*pCount);
pCount = h.pCount;
return *this;
}
HasPtr::~HasPtr()
{
--(*pCount);
if(0 == (*pCount))
{
delete ptr;
delete pCount;
}
}
int main()
{
int* p = new int(42);
HasPtr test(p,50);
test.print_reference_count();
HasPtr test2(p,60);
test2.print_reference_count();
HasPtr test3(test);
test.print_reference_count();
test3.print_reference_count();
test2 = test3;
test.print_reference_count();
test3.print_reference_count();
test2.print_reference_count();
return 0;
}
int *pCount 是指向引用计数的指针;
实现引用计数还有其他的方式
//待补充
相关文章推荐
- C语言从命令行接收参数
- C语言中快速排序和插入排序优化的实现
- C语言下载网页源代码并保存到本地磁盘
- [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1
- 求数组相邻元素差值的最大值快速算法(C++版)
- strlen函数实现——string.h库函数
- c语言:分别使用for循环和while循环求5!
- 面试之C++题目汇总7
- c语言:输出(Welcome??)和(Welcome\?\?)
- 面试之C++题目汇总6
- 使用Java中的JNI技术将C/C++程序嵌入到Java代码中实现Hello World
- 面试之C++题目汇总5
- 面试之C++面试题汇总4
- 面试之C++面试题汇总3
- c语言:有趣的转义字符用法
- c语言:对于一个变量n,const用法和指针的比较
- How to call C/C++ sytle function from C# solution?
- 面试之C++题目汇总2
- 面试之C++题目汇总
- traincascade.cpp