c++垃圾回收代码练习 引用计数
学习实践垃圾回收的一个小代码
采用引用计数
每次多一个指针指向这个分配内存的地址时候 则引用计数加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++垃圾回收代码练习 引用计数的更多相关文章
- Python的垃圾回收机制(引用计数+标记清除+分代回收)
一.写在前面: 我们都知道Python一种面向对象的脚本语言,对象是Python中非常重要的一个概念.在Python中数字是对象,字符串是对象,任何事物都是对象,而它们的核心就是一个结构体--PyOb ...
- Python的垃圾回收机制以及引用计数
Python中的计数引用 在Python中,由于Python一门动态的语言,内部采用的指针形式对数据进行标记的,并不像c/c++那样,通过指定的数据类型并分配相应的数据空间,Python中定义的变量名 ...
- PHP的垃圾回收机制之引用计数
1,介绍 php的垃圾回收机制(GC)是在PHP5之后出现的,而在PHP5.3版本之前使用的都是“引用计数”的方式.实现引用计数的实质就是在每个内存对象中都有一个计数器,当内存对象被变量引用时,计数器 ...
- Python垃圾回收详解:引用计数+标记清理+分代回收
Python采用的是引用计数机制为主,标记-清理和分代收集两种机制为辅的策略. 1.引用计数 python中一切皆对象,所以python底层计数结构地就可以抽象为: 引用计数结构体{ 引用计数; 引用 ...
- PHP GC垃圾回收机制之引用变量回收周期疑问
普通的引用变量的销毁大家都知道, 当unset的时候如果refcount = 0 则认为无用, 销毁. 但是手册中提到一点会有递归引用的问题,很是奇葩 代码如下 <?php $a = 1; $a ...
- php 调试工具及学习PHP垃圾回收机制了解引用计数器的概念
php代码工具:Xdebug 与分析工具 WinCacheGrind Xdebug之函数大全: string xdebug_call_class()返回当前被调用的函数或方法所属的类的类名 stri ...
- 学习PHP垃圾回收机制了解引用计数器的概念
php变量存在一个叫"zval"的变量容器中,"zval"变量容器包括含变量的类型和值,还包括额外的两个字节信息,分别是“is_ref”表示变量是否属于引用,“ ...
- Python引用复制,参数传递,弱引用与垃圾回收
引用 先上个示例: >>> val = [1] >>> val[0] = val >>> val [[...]] 上述代码使val中包含自身,而产 ...
- 编程语言分类,Python代码执行,应用程序使用文件的三步骤,变量,常量,垃圾回收机制
编程语言分为 机器语言(直接用二进制01跟计算机直接沟通交流,直接操作硬件) 优点:计算机能够直接读懂,速度快 缺点:开发效率极低 汇编语言(用简单的英文标签来表示二进制数,直接操作硬件) 优点:开发 ...
随机推荐
- 利用硬链接和truncate降低drop table对线上环境的影响
众所周知drop table会严重的消耗服务器IO性能,如果被drop的table容量较大,甚至会影响到线上的正常. 首先,我们看一下为什么drop容量大的table会影响线上服务 直接执行drop ...
- Hibernate5.2关联关系之单向一对多(一)
Hibernate5.2之单向一对多 一. 简介 Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibe ...
- textview 显示html方法解析
现在网络的繁盛时代,光文字是不能满足人们的胃口的,图片,flash,音频,视频就成为浏览网页的主流显示,在手机上也一样.在手机上显示从网络端获取的数据显示,大家很自然的想起两种方式,一种就是webvi ...
- mysql数据库优化小结
一.常见数据库的优化操作 1.表的设计要符合三范式. 2.添加适当的索引,索引对查询速度影响很大,必须添加索引.主键索引,唯一索引,普通索引,全文索引 3.添加适当存储过程,触发器,事务等. 4.读写 ...
- System.exit(1)
用于退出java的虚拟机,也是finally块中语句不被执行的唯一情况
- iOS开发--一些UITabBarItem属性的设置[转]
1.改变UITabBarItem 字体颜色 [[UITabBarItemappearance]setTitleTextAttributes:[NSDictionary dictionaryWithOb ...
- 关于listview的一些属性
由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你 ...
- python中subprocess.Popen.poll
import subprocess proc = subprocess.Popen(['python', 'test.py'], stdout=subprocess.PIPE) while 1: pr ...
- HDOJ2222 Keywords Search-AC自动机
Problem Description In the modern time, Search engine came into the life of everybody like Google, B ...
- SQL Server开启READ_COMMITTED_SNAPSHOT
--查询数据库状态 select name,user_access,user_access_desc, snapshot_isolation_state,snapshot_isolation_ ...