Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1774365
  • 博文数量: 198
  • 博客积分: 4088
  • 博客等级: 上校
  • 技术积分: 2391
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-15 16:29
个人简介

游戏开发,系统架构; 博客迁移到:http://www.jianshu.com/u/3ac0504b3b8c

文章分类

全部博文(198)

文章存档

2017年(1)

2016年(12)

2015年(1)

2014年(3)

2013年(13)

2012年(18)

2011年(150)

分类: C/C++

2011-12-05 09:34:13

shared_ptr.h
  1. template <class T>
  2. class Shared_ptr
  3. {
  4.     typedef int countType;
  5. public:
  6.     Shared_ptr()
  7.         :ptr(0)
  8.         ,count(0)
  9.     {
  10.     }
  11.     Shared_ptr(T* p)
  12.         :ptr(p)
  13.         ,count(0)
  14.     {
  15.         count = new countType(1);
  16.     }

  17.     Shared_ptr(const Shared_ptr& p)
  18.         :ptr(p.ptr)
  19.         ,count(p.count)
  20.     {
  21.         ++(*count);
  22.     }

  23.     Shared_ptr& operator=(const Shared_ptr& p)
  24.     {
  25.         if(this == &p) return *this;
  26.         
  27.         free();

  28.         ptr = p.ptr;
  29.         count = p.count;
  30.         ++(*count);

  31.         return *this;
  32.     }

  33.     ~Shared_ptr()
  34.     {
  35.         free();
  36.     }

  37.     T& operator*() const
  38.     {
  39.         //assert
  40.         return *ptr;
  41.     }

  42.     T* operator->()const
  43.     {
  44.         return ptr;
  45.     }

  46.     T* get() const
  47.     {
  48.         return ptr;
  49.     }

  50.     int getCount() const
  51.     {
  52.         return *count;
  53.     }


  54. private:
  55.     void free()
  56.     {
  57.         if(*count == 0) return;

  58.         --(*count);

  59.         if(*count == 0)
  60.         {
  61.             if(ptr)
  62.             {
  63.                 delete ptr;
  64.                 ptr = 0;
  65.             }

  66.             if(count)
  67.             {
  68.                 delete count;
  69.                 count = 0;
  70.             }
  71.         }
  72.     }

  73. private:
  74.     T* ptr;
  75.     countType* count;
  76. };

test.cpp

  1. #include "shared_ptr.h"
  2. #include <crtdbg.h>
  3. #include <iostream>

  4. #ifdef _DEBUG

  5. #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)

  6. #endif



  7. class TestClass
  8. {
  9. public:
  10.     TestClass()
  11.         :X(0)
  12.         ,Y(0)
  13.     {
  14.     }
  15.     TestClass(int x, int y)
  16.         :X(x)
  17.         ,Y(y)
  18.     {
  19.     }
  20.     ~TestClass(){}

  21. private:
  22.     int X;
  23.     int Y;
  24. };

  25. void test()
  26. {
  27.     Shared_ptr<TestClass> testClassPtr(new TestClass(3, 2));
  28.     Shared_ptr<TestClass> testClassPtr1(testClassPtr);
  29.     std::cout << "count1: " << testClassPtr1.getCount()<< std::endl;

  30.     Shared_ptr<TestClass> testClassPtr2(new TestClass(4, 5));
  31.     Shared_ptr<TestClass> testClassPtr3(testClassPtr2);

  32.     std::cout << "count2: " << testClassPtr2.getCount() << std::endl;

  33.     testClassPtr3 = testClassPtr;
  34.     std::cout << "count1: " << testClassPtr1.getCount()<< std::endl;
  35.     std::cout << "count2: " << testClassPtr2.getCount() << std::endl;

  36.     
  37. }

  38. int main()
  39. {
  40.     
  41.     test();

  42.     _CrtDumpMemoryLeaks();

  43.     system("pause");

  44.     return 0;
  45. }
阅读(1601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~