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++简单实现对象引用计数示例(转)的更多相关文章

  1. Linus:为何对象引用计数必须是原子的

    Linus大神又在rant了!这次的吐槽对象是时下很火热的并行技术(parellism),并直截了当地表示并行计算是浪费所有人时间(“The whole “let’s parallelize” thi ...

  2. Playmaker全面实践教程之简单的使用Playmaker示例

    Playmaker全面实践教程之简单的使用Playmaker示例 简单的使用Playmaker示例 通过本章前面部分的学习,相信读者已经对Playmaker有了一个整体的认识和印象了.在本章的最后,我 ...

  3. 一个简单的JSP程序示例

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  4. lambda表达式/对象引用计数

    ★lambda表达式的用法例:I=[(lambda x: x*2),(lambda y: y*3)]调用:for x in I: print x(2)输出:4,6 ★获取对象的引用次数sys.getr ...

  5. python 对象引用计数增加和减少的情况

    对象引用计数增加的情况: 1.对象被创建:x=4 2.另外的别人被创建:y=x 3.被作为参数传递给函数:foo(x)  ->会增加2 4.作为容器对象的一个元素:a=[1,x,'33'] 对象 ...

  6. 简单的Spring Batch示例

    使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算. 现在写一个简单的入门版示例. 这里默认大家已经掌握了Spring Batch的基本知识,示例只是为了快速上手实践 ...

  7. 使用TensorFlow v2张量的一个简单的“hello world”示例

    使用TensorFlow v2张量的一个简单的"hello world"示例 import tensorflow as tf # 创建一个张量 hello = tf.constan ...

  8. [ JS 进阶 ] 基本类型 引用类型 简单赋值 对象引用

    ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...

  9. Object-C内存管理-对象引用计数的特例

    看到OC中内存管理这块,其中的引用计数部分,部分10.5上的EBOOK示例已经在10.9上不能运行正确了,比如下面的代码: NSString * str1 = @"string 1" ...

随机推荐

  1. django第9天(多表操作)

    django第9天 models类 class Book(Model): id = AutoField(primary_key=True) name = CharField(max_length=20 ...

  2. uboot的Makefile裁剪(针对飞思卡尔的mx6系列)

    VERSION = 2009PATCHLEVEL = 08SUBLEVEL =EXTRAVERSION =ifneq "$(SUBLEVEL)" ""U_BOO ...

  3. 【LeetCode】Path Sum(路径总和)

    这道题是LeetCode里的第112道题.是我在学数据结构——二叉树的时候碰见的题.题目要求: 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 ...

  4. grunt与requirejs结合使用

    // 多个js压缩成一个js // Project configuration. module.exports = function(grunt) { // 使用严格模式 'use strict'; ...

  5. joyoi1864 守卫者的挑战

    #include <algorithm> #include <iostream> #include <cstdio> using namespace std; in ...

  6. Hive中文注释乱码解决方案

    本文来自网易云社区 作者:王潘安 快速解决方法 目前的hive客户端在执行desc tablexxx和show create table xxx命令的时候,字段的中文注释会出现乱码情况,如(????) ...

  7. Yii2.0 添加分类category model类

    <?php namespace app\models; use yii\db\ActiveRecord; use Yii; use yii\helpers\ArrayHelper; class ...

  8. [Istio]Web应用出现upstream connect error or disconnect/reset before headers

    在部署web应用之后,使用ingressway为入口,不能正常访问.服务返回 upstream connect error or disconnect/reset before headers 这种情 ...

  9. 【bzoj4930】棋盘 费用流

    题目描述 给定一个n×n的棋盘,棋盘上每个位置要么为空要么为障碍.定义棋盘上两个位置(x,y),(u,v)能互相攻击当前仅 当满足以下两个条件: 1:x=u或y=v 2:对于(x,y)与(u,v)之间 ...

  10. POJ 3693 Maximum repetition substring ——后缀数组

    重复次数最多的字串,我们可以枚举循环节的长度. 然后正反两次LCP,然后发现如果长度%L有剩余的情况时,答案是在一个区间内的. 所以需要找到区间内最小的rk值. 两个后缀数组,四个ST表,$\Thet ...