引用计数:
当多个对象同时使用一个相同对象的资源时,会发生两种情况:
①
浅拷贝时,虽然节约资源,但是释放的时候会出现问题。
②
深拷贝时,虽然释放不会出现问题,但是浪费了资源。
为了两者都兼容,出现了引用计数。
#include "stdafx.h" #include "Student.h" int main(int argc, char* argv[]) { CStudent stu1("小明"); CStudent stu2 = stu1; CStudent stu3 = stu1; CStudent stu4 = stu1; CStudent stu5 = stu1; stu5.SetName("小芳"); stu3 = stu3; CStudent stu6 = stu5; return 0; }
#include "stdafx.h" #include "Student.h" #include <STRING.H> CRefCount::CRefCount(char* pszName) { SetName(pszName); } CRefCount::~CRefCount() { if (m_szName == NULL) { delete m_szName; m_szName = NULL; } } bool CRefCount::SetName(char* pszName) { m_szName = new char[256]; strcpy(m_szName, pszName); m_nRefCount = 1; return true; } bool CRefCount::AddRef() { m_nRefCount++; return true; } bool CRefCount::ReleaseRef() { if (--m_nRefCount == 0) { delete this; } return true; } CStudent::CStudent() { m_pRef = NULL; } CStudent::CStudent(char* pszName) { m_pRef = new CRefCount(pszName); } void CStudent::SetName(char* pszName) { if (m_pRef != NULL) { m_pRef->ReleaseRef(); } m_pRef = new CRefCount(pszName); } CStudent::~CStudent() { if (m_pRef != NULL) { m_pRef->ReleaseRef(); m_pRef = NULL; } } CStudent::CStudent(CStudent& obj) { m_pRef = NULL; if (obj.m_pRef != NULL) { m_pRef = obj.m_pRef; m_pRef->AddRef(); } } CStudent& CStudent::operator=(const CStudent& oj) { if (m_pRef == oj.m_pRef) { return *this; } if (m_pRef != NULL) { m_pRef->ReleaseRef(); } m_pRef = oj.m_pRef; m_pRef->AddRef(); return *this; }