学习实践垃圾回收的一个小代码

采用引用计数

每次多一个指针指向这个分配内存的地址时候 则引用计数加1

当计数为0 则释放内存 他的难点在于指针之间的复制 所有权交换 计数的变化

#include <vector>
#include <iostream>

using namespace std;

template<typename T>
class GCInfo {
unsigned int refcount_;
T* ptr_;
public:
GCInfo(T* ptr) {
refcount_ = 1;
ptr_ = ptr;
}
void IncreRef() {
refcount_++;
}
void DecreRef() {
refcount_--;
}
unsigned int GetRef() const{
return refcount_;
}
T* GetPoint() const{
return ptr_;
}
};

template<typename T,int size = 0>
class GCPtr {
//static vector<GCInfo<T>> gclist;
GCInfo<T>* pgcInfo_;
public:
GCPtr(T* t){
cout << "creatr ptr: " << typeid(T).name()
<< " addr: " << t << endl;
pgcInfo_ = new GCInfo<T>(t);
}

GCPtr(const GCPtr& gcp) {
pgcInfo_ = gcp.pgcInfo_;
pgcInfo_->IncreRef();
}

GCPtr& operator=(const GCPtr& gcp) {
pgcInfo_ = gcp.pgcInfo_;
pgcInfo_->IncreRef();
}

T* GetPtr() {
return pgcInfo_->GetPoint();
}

~GCPtr() {
pgcInfo_->DecreRef();
if (pgcInfo_->GetRef() == 0) {
cout << "delete ptr: " << typeid(T).name()
<< " addr: " << pgcInfo_->GetPoint() << endl;
delete pgcInfo_->GetPoint();
delete pgcInfo_;
}

}

};

测试代码

#include "gc.h"
#include <string>

using namespace std;

void test(GCPtr<string>& gcpStr) {
GCPtr<string> t = gcpStr;
GCPtr<string> o(t);
cout << *o.GetPtr() << endl;
}

int main()
{
{
GCPtr<int> a(new int(9));
GCPtr<int> b(a);
GCPtr<int> c = a;
}
GCPtr<string> a(new string("this is a test"));
test(a);

vector<GCPtr<string>> v;
v.push_back(a);
v.push_back(new string("test2"));
cout << *((v.back()).GetPtr()) << endl;

return 0;
}

最新文章

  1. .NET Core 2016 回顾
  2. java JSP(原创新手可进)
  3. Spring Boot入门实例
  4. jQ中对attr()方法的理解
  5. 简单工厂VS工厂方法
  6. hdu4085 Peach Blossom Spring 斯坦纳树,状态dp
  7. JVM内存管理(二)
  8. eclipse快速查找一个变量、方法或者类被引用的地方
  9. 【转】YUV格式&amp;像素
  10. 玩转python之测试一个对象是否是类字符串
  11. php 10.1总
  12. Education Round16
  13. 关于Java中继承多接口同名方法的问题
  14. 人生苦短,我用Python(1)
  15. Oracle:SQL语句--对表的操作——修改表名
  16. Asp.netCore之安装centos7 资料收集
  17. 【linux】安装docker
  18. 六 json&amp;pickle模块
  19. hdu 3295 模拟过程。数据很水
  20. web 应用中访问 Spring 具体实现

热门文章

  1. HBase体系结构(转)
  2. Junit4常用注解
  3. elastic search 配置问题
  4. JDBC进行批处理
  5. [转]CABasicAnimation用法
  6. JQ怎么获取margin-left的值
  7. MBW内存测试
  8. 纸上谈兵:AVL树
  9. webview中的页面兼容iphone6和6+
  10. java, poi, excel