fork download
  1. #include <iostream>
  2.  
  3. #define STRING(str) #str
  4.  
  5. class Object
  6. {
  7. int __refs;
  8. public:
  9. Object() : __refs(1)
  10. {
  11. }
  12. virtual ~Object(){}
  13. int AddRef()
  14. {
  15. return this->__refs++;
  16. }
  17. void Release()
  18. {
  19. if( --this->__refs <= 0)
  20. delete this;
  21. }
  22. };
  23.  
  24.  
  25. class Resource
  26. : public Object
  27. {
  28. public:
  29. Resource() : Object()
  30. {
  31. std::cout<<STRING(Resource::Resource())<<std::endl;
  32. }
  33. ~Resource()
  34. {
  35. std::cout<<STRING(Resource::~Resource())<<std::endl;
  36. }
  37. };
  38.  
  39.  
  40. class Factory
  41. {
  42. public:
  43. static Resource* CreateResource()
  44. {
  45. return new Resource();
  46. }
  47. };
  48.  
  49. void gimeSomeResource(Resource* res)
  50. {
  51. res->AddRef();
  52. //... work with it
  53. res->Release();
  54. }
  55. void moreResourceForWork(Resource* res)
  56. {
  57. res->AddRef();
  58. gimeSomeResource(res);
  59. gimeSomeResource(res);
  60. res->Release();
  61. }
  62.  
  63.  
  64. int main()
  65. {
  66.  
  67. Resource* someRes = Factory::CreateResource();
  68. gimeSomeResource(someRes);
  69. moreResourceForWork(someRes);
  70.  
  71. someRes->Release();
  72.  
  73. return 0;
  74. }
  75.  
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
Resource::Resource()
Resource::~Resource()