C++简单实现对象引用计数示例(转)
C++简单实现对象引用计数示例
#include <iostream>
#include <stdio.h> using namespace std; class String {
public:
String(const char *pdata);
String(const String &rhs);
String &operator = (const String &rhs);
~String(); public: //应该使用private,但为了演示的目的而使用public
//内部类
class StringValue {
public:
StringValue(const char *pdata);
~StringValue();
public:
int refCount;
char *data;
}; StringValue *value;//所有的引用对象均共享唯一一个value,value里面实际存储data和引用次数
}; String::StringValue::StringValue(const char *pdata):refCount() {
data = new char[strlen(pdata) + ];
strcpy(data,pdata);
} String::StringValue::~StringValue() {
delete [] data;
} String::String(const char *pdata) : value(new StringValue(pdata)) {} String::String(const String &rhs) {//要对引用加1
value = rhs.value;
(value->refCount)++;//所有指向同一段data的对象的引用加1
} String &String::operator =(const String &rhs) {
if (value == rhs.value)//注意,不是this == &rhs
return *this;
if(--value->refCount == )
{
printf("operator =[delete value] value->refCount=%d\n",value->refCount);
delete value;
} value = rhs.value;
++(value->refCount); return *this;
} String::~String() {
if ( (--value->refCount) == )
{
printf("~String():[delete value] value->refCount=%d\n",value->refCount);
delete value;
}
else
{
printf("~String(): value->refCount=%d\n",value->refCount);
}
} void test() {
String ss("ssss");
printf("ss.value->refCount=%d\n",ss.value->refCount);
String s1 = ss;
printf("s1.value->refCount=%d\n",s1.value->refCount);
printf("ss.value->refCount=%d\n",ss.value->refCount);
String s2("dddd");
printf("s2.value->refCount=%d\n",s2.value->refCount);
s2 = ss;
printf("s2.value->refCount=%d\n",s2.value->refCount);
printf("ss.value->refCount=%d\n",ss.value->refCount);
} int main() {
test();
}
运行结果如下:
ss.value->refCount=1
s1.value->refCount=2
ss.value->refCount=2
s2.value->refCount=1
operator =[delete value] value->refCount=0
s2.value->refCount=3
ss.value->refCount=3
~String(): value->refCount=2
~String(): value->refCount=1
~String():[delete value] value->refCount=0
转自:http://blog.csdn.net/chinawangfei/article/details/50680574
C++简单实现对象引用计数示例(转)的更多相关文章
- Linus:为何对象引用计数必须是原子的
Linus大神又在rant了!这次的吐槽对象是时下很火热的并行技术(parellism),并直截了当地表示并行计算是浪费所有人时间(“The whole “let’s parallelize” thi ...
- Playmaker全面实践教程之简单的使用Playmaker示例
Playmaker全面实践教程之简单的使用Playmaker示例 简单的使用Playmaker示例 通过本章前面部分的学习,相信读者已经对Playmaker有了一个整体的认识和印象了.在本章的最后,我 ...
- 一个简单的JSP程序示例
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- lambda表达式/对象引用计数
★lambda表达式的用法例:I=[(lambda x: x*2),(lambda y: y*3)]调用:for x in I: print x(2)输出:4,6 ★获取对象的引用次数sys.getr ...
- python 对象引用计数增加和减少的情况
对象引用计数增加的情况: 1.对象被创建:x=4 2.另外的别人被创建:y=x 3.被作为参数传递给函数:foo(x) ->会增加2 4.作为容器对象的一个元素:a=[1,x,'33'] 对象 ...
- 简单的Spring Batch示例
使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算. 现在写一个简单的入门版示例. 这里默认大家已经掌握了Spring Batch的基本知识,示例只是为了快速上手实践 ...
- 使用TensorFlow v2张量的一个简单的“hello world”示例
使用TensorFlow v2张量的一个简单的"hello world"示例 import tensorflow as tf # 创建一个张量 hello = tf.constan ...
- [ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...
- Object-C内存管理-对象引用计数的特例
看到OC中内存管理这块,其中的引用计数部分,部分10.5上的EBOOK示例已经在10.9上不能运行正确了,比如下面的代码: NSString * str1 = @"string 1" ...
随机推荐
- ARM-Linux基本开发步骤
拿到一块YC2440(s3c2440)的开发板,经过几天的学习,我对arm-linux系统开发步骤有了一些认识.就以开发这个开发板为例,arm-linux开发工作大概分4个部分 1. 硬件 ...
- cs229_part3
接下来就是最最最重要的一个有监督学习算法了. 支持向量机 问题背景 样本集表示: \[(x,y)\in D, x\in R^n, y\in \{-1,+1\}\] 回到之前的逻辑回归模型中: 逻辑回归 ...
- PAT Basic 1047
1047 编程团体赛 编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: ...
- 模板<最小生成树>
转载 最小生成树浅谈 这里介绍最小生成树的两种方法:Prim和Kruskal. 两者区别:Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣.Prim是以更新过的节点的连边找最小值,K ...
- 关于面试总结-app测试面试题
前言 现在面试个测试岗位,都是要求全能的,web.接口.app啥都要会测,那么APP测试一般需要哪些技能呢? 面试app测试岗位会被问到哪些问题,怎样让面试管觉得你对APP测试很精通的样子? 本篇总结 ...
- BNUOJ 6727 Bone Collector
Bone Collector Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Origin ...
- .NET重构(一):抽象工厂模式实现登录
导读:一路艰辛,我也走到了重构.在重构之前,师傅让用经典三层(UI.BLL.DAL)敲了登录.用户的增删改查,共五条线.从开始对三层的朦胧,到五条线结束,终于对三层有了逻辑上清晰的理解.然后就画了几天 ...
- XML文件的操作说明
说明:C#中XmlNode与XmlElement的区别如下:xmlnode类表示xml文档中的单个节点,其命名空间为:System.Xml.XmlNode的三个最主要的子类包括:XmlDocument ...
- java面向抽象编程样例
import java.util.*; abstract class Geometry{ public abstract double getArea(); } class Pillar ...
- nginx报错504
Nginx 504错误(Gateway time-out 网关超时)的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI. 一般看来, 这种情况可能是由于nginx默认的f ...