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

采用引用计数

每次多一个指针指向这个分配内存的地址时候 则引用计数加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;
}

c++垃圾回收代码练习 引用计数的更多相关文章

  1. Python的垃圾回收机制(引用计数+标记清除+分代回收)

    一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...

  2. Python的垃圾回收机制以及引用计数

    Python中的计数引用 在Python中,由于Python一门动态的语言,内部采用的指针形式对数据进行标记的,并不像c/c++那样,通过指定的数据类型并分配相应的数据空间,Python中定义的变量名 ...

  3. PHP的垃圾回收机制之引用计数

    1,介绍 php的垃圾回收机制(GC)是在PHP5之后出现的,而在PHP5.3版本之前使用的都是“引用计数”的方式.实现引用计数的实质就是在每个内存对象中都有一个计数器,当内存对象被变量引用时,计数器 ...

  4. Python垃圾回收详解:引用计数+标记清理+分代回收

    Python采用的是引用计数机制为主,标记-清理和分代收集两种机制为辅的策略. 1.引用计数 python中一切皆对象,所以python底层计数结构地就可以抽象为: 引用计数结构体{ 引用计数; 引用 ...

  5. PHP GC垃圾回收机制之引用变量回收周期疑问

    普通的引用变量的销毁大家都知道, 当unset的时候如果refcount = 0 则认为无用, 销毁. 但是手册中提到一点会有递归引用的问题,很是奇葩 代码如下 <?php $a = 1; $a ...

  6. php 调试工具及学习PHP垃圾回收机制了解引用计数器的概念

    php代码工具:Xdebug  与分析工具 WinCacheGrind Xdebug之函数大全: string xdebug_call_class()返回当前被调用的函数或方法所属的类的类名 stri ...

  7. 学习PHP垃圾回收机制了解引用计数器的概念

    php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“ ...

  8. Python引用复制,参数传递,弱引用与垃圾回收

    引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产 ...

  9. 编程语言分类,Python代码执行,应用程序使用文件的三步骤,变量,常量,垃圾回收机制

    编程语言分为 机器语言(直接用二进制01跟计算机直接沟通交流,直接操作硬件) 优点:计算机能够直接读懂,速度快 缺点:开发效率极低 汇编语言(用简单的英文标签来表示二进制数,直接操作硬件) 优点:开发 ...

随机推荐

  1. PHP中float变量转换为int时,结果有误的问题!

    先上例子: <?php $money = 100; $rate = 1.15; $result = $money * $rate; var_dump( intval( $result ) ); ...

  2. [MySQL] 忘记root账户密码怎么办

    一.缘由 由于各种原因,我们会忘记mysql的root密码. 二.解决办法 方法一:skip-grant-tables方式启动 1.停止mysql服 务 service mysqld stop 2.以 ...

  3. Spring AOP 完成日志记录

    Spring AOP 完成日志记录 http://hotstrong.iteye.com/blog/1330046

  4. 这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script

    这些年我们一起搞过的持续集成~Jenkins+Perl and Shell script ##转载注明出处:http://www.cnblogs.com/wade-xu/p/4378224.html ...

  5. LoadRunner 多场景批处理

    @echo off echo *********************************echo ****多场景测试*************echo ******************** ...

  6. 标清与高清,720p和1080p,720i和720p,h264与h265

    480x320, 640x480 标清 1024x720p 高清 1920x1080i (隔行扫描) 也属于高清 1920x1080p 全高清 3840x2160,7680x4320 超(高)清   ...

  7. 百度地图API示例之添加/删除工具条、比例尺控件

    代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" cont ...

  8. NHibernate系列文章十六:使用程序集管理NHibernate项目(附程序下载)

    摘要 在实际的项目中,经常是将NHibernate的实体关系映射类做成独立的工程(assembly dll),只对外提供Session调用的接口.这个程序集作为数据访问层,可以被上面的多个工程(ASP ...

  9. NHibernate系列文章十八:NHibernate关系之一对多(附程序下载)

    摘要 这篇文章介绍NHibernate最实用的内容:关系映射. NHibernate的关系映射方式有三种: Set:无序对象集合,集合中每一个元素不能重复. List:有序对象集合,集合中的元素可以重 ...

  10. 百度Ueditor

    最近用到了百度Ueditor,也来写一写百度Ueditor的使用教程: 一.从官网下载百度Ueditor,http://ueditor.baidu.com/website/download.html, ...