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跟计算机直接沟通交流,直接操作硬件) 优点:计算机能够直接读懂,速度快 缺点:开发效率极低 汇编语言(用简单的英文标签来表示二进制数,直接操作硬件) 优点:开发 ...
随机推荐
- 【总结】我所整理的各种CSS居中
在网上看了很多文章,自己也总结了一下,虽说是自己写的,但是还是要列出我参考过的那些文章的地址,感谢你们的分享! http://blog.gejiawen.com/2015/03/13/css-lay ...
- Hololens开发笔记之Gesture手势识别(单击,双击)
本文使用手势识别实现识别单击及双击手势的功能,当单击Cube时改变颜色为蓝色,当双击Cube时改变颜色为绿色. 手势识别是HoloLens交互的重要输入方法之一.HoloLens提供了底层API和高层 ...
- Python偏函数
偏函数 一个带n 个参数,curried 的函数固化第一个参数为固定参数,并返回另一个带n-1 个参数函数对象 >>> from functools import partial & ...
- ArcGIS for Flex中引入google map作底图
上篇文章到在ArcGIS View中引入google map,这里讲ArcGIS for Flex中引入google map作底图. 同样道理,以google map作底图,需要编写继承自TiledM ...
- jface的CheckboxTreeViewer实现单选
需求:使用FilteredTree实现一个下面这样的Dialog,要求Check框单选,即只能选择一个:当选择新的时候,旧的不选.说明:FilteredTree自带一个文本输入框. 1.自己的类继承o ...
- MyBatis学习总结(五)——实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Qlikview 图标控件实现动态分组
首先编辑一个组合字段,eg, TimeDimension, 内含2个字段(即为动态可以切换的分组字段) 将TimeDimension 作为分组字段.表达式字段 Sum(Sales),结果如图示 在图片 ...
- PHP&MySQL 语法
PHP操作MySQL数据库 第一步:连接数据库 $dbhost = 'localhost:3306'; //mysql服务器主机地址 $dbuser = 'guest'; //mysql用户名 $db ...
- 几篇关于VisualStudio的调试工具文章
现代的软件变得日益复杂,强大的调试功能也变得日益重要起来.在VisualStudio的最近几个版本中,在调试工具方面也是增强了不少的,本文转录了几个微软官方介绍的一些新增的调试功能的文章,如果能很好的 ...
- 根据日期 读取三个csv不留指定日期的内容 新保存一个文件
using System;using System.Collections.Generic;using System.Drawing;using System.Globalization;using ...