fork download
  1. #include <iostream>
  2.  
  3. template<typename T>
  4. class SharedPtr {
  5. T* value;
  6. int* ref_count;
  7.  
  8. public:
  9. SharedPtr(T* value) : value(value) {
  10. ref_count = new int;
  11. *ref_count = 1;
  12. }
  13.  
  14. SharedPtr(const SharedPtr& other) {
  15. value = other.value;
  16. ref_count = other.ref_count;
  17. (*ref_count)++;
  18. }
  19.  
  20. SharedPtr(SharedPtr&& other) {
  21. value = other.value;
  22. ref_count = other.ref_count;
  23. other.ref_count = nullptr;
  24. }
  25.  
  26. ~SharedPtr() {
  27. if (ref_count == nullptr) {
  28. return;
  29. }
  30.  
  31. if (*ref_count == 1) {
  32. delete value;
  33. delete ref_count;
  34. } else {
  35. (*ref_count)--;
  36. }
  37. }
  38.  
  39. T& operator *() const {
  40. return *value;
  41. }
  42.  
  43. T* operator ->() const {
  44. return value;
  45. }
  46. };
  47.  
  48. struct Pituh {
  49. Pituh() {
  50. std::cout << "Koko()" << std::endl;
  51. }
  52. ~Pituh() {
  53. std::cout << "~Koko()" << std::endl;
  54. }
  55. void kukareku() {
  56. std::cout << "kukareku" << std::endl;
  57. }
  58. };
  59.  
  60. void kukareknut1(SharedPtr<Pituh> pet) {
  61. pet->kukareku();
  62. }
  63. void kukareknut2(SharedPtr<Pituh> pet) {
  64. (*pet).kukareku();
  65. }
  66.  
  67. int main() {
  68. {
  69. SharedPtr<Pituh>(new Pituh);
  70. }
  71. std::cout << std::endl;
  72.  
  73. {
  74. SharedPtr<Pituh> x(new Pituh);
  75. auto y = x;
  76. kukareknut1(y);
  77. kukareknut2(std::move(y));
  78. }
  79. std::cout << std::endl;
  80. }
Success #stdin #stdout 0s 5524KB
stdin
Standard input is empty
stdout
Koko()
~Koko()

Koko()
kukareku
kukareku
~Koko()