C++引用计数实现垃圾回收机制
2012-08-27 12:58
615 查看
原理:用一个数去统计指向堆中的无名对象指针的个数,由最后一个指针去释放其空间。为了保持同步,应该使这个数也只有一份。
简单实现如下
简单实现如下
//SmartPtr.h #pragma once #include <iostream> using namespace std; template <class T> class CSmartPtr { public: CSmartPtr():m_ptr(NULL),m_count(NULL) { } CSmartPtr( T* ptr):m_count(new int(1)),m_ptr(ptr) { } ~CSmartPtr() { if(m_count!= NULL) { (*m_count)--; if( *m_count<=0 && m_ptr!= NULL) { delete m_ptr; delete m_count; } } } CSmartPtr(const CSmartPtr<T>& CPtr) { m_ptr=CPtr.m_ptr; if(CPtr.m_ptr != NULL) { (*CPtr.m_count)++; } m_count=CPtr.m_count; } CSmartPtr<T>& operator =(const CSmartPtr<T>& CPtr) { if(this != &CPtr)//不是自己给自己赋值 { (*m_count)--; if((*m_count<=0) && (m_ptr!= NULL) ) { delete m_ptr; } m_ptr=CPtr.m_ptr; if(CPtr.m_ptr != NULL) { (*CPtr.m_count)++; } m_count=CPtr.m_count; } return *this; } bool operator !=(const CSmartPtr<T>& CPtr) { return (m_ptr != CPtr.m_ptr); } bool operator ==(const CSmartPtr<T>& CPtr) { return (m_ptr == CPtr.m_ptr); } T* operator ->() { return m_ptr; } T* GetPtr() { return m_ptr; } int GetCount() { return (*m_count); } private: T *m_ptr; int *m_count; }; //test.cpp #include "SmartPtr.h" #include <string> class CTest { public: CTest(string name):m_name(name) { cout<<m_name<<" Construction.\n"; } ~CTest() { cout<<m_name<<" Destructor.\n"; } private: string m_name; }; void main() { CSmartPtr<CTest> ptr1= new CTest("test1"); CSmartPtr<CTest> ptr2(NULL); CSmartPtr<CTest> ptr3; ptr2=ptr1; }
相关文章推荐
- 垃圾回收机制中,引入计数是如何实现的,内部原理是什么,怎么维持对象引用的
- Herbert Schildt对C++垃圾回收机制的实现
- PHP特点之垃圾回收机制1——引用计数的基本知识
- 垃圾回收:引用计数与分代收集机制
- php 垃圾回收机制 写时复制和引用计数
- php的垃圾回收机制——引用计数
- PHP垃圾回收机制之引用计数
- C++实现的垃圾回收机制
- C++实现垃圾回收机制
- php垃圾回收机制_引用计数基本知识 (php也存在内存泄漏)
- C++实现多线程对象内存池带垃圾回收机制
- PHP之引用计数内存管理机制和垃圾回收机制
- 垃圾回收机制--引用计数基本知识
- PHP垃圾回收机制引用计数器概念分析
- C++ 为什么不加入垃圾回收机制
- C++(浅析)智能指针及C#GC(垃圾回收机制)分析[图]
- 如何用C++来建立自己的垃圾回收机制?!
- PHP垃圾回收机制引用计数器概念
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- C++为什么不加入垃圾回收机制