fork download
  1. #include <iostream>
  2.  
  3. template <typename T>
  4. class shared_ptr {
  5. T *ptr;
  6. int *cnt;
  7. public:
  8. shared_ptr(T *ptr) : ptr(ptr), cnt(new int(1)) {}
  9. shared_ptr(shared_ptr const& o) : ptr(o.ptr), cnt(o.cnt) { ++*cnt; }
  10. ~shared_ptr() { if (!--*cnt) { delete ptr; delete cnt; } }
  11.  
  12. friend inline void swap(shared_ptr& lhs, shared_ptr& rhs)
  13. { std::swap(lhs.ptr, rhs.ptr); std::swap(lhs.cnt, rhs.cnt); }
  14. shared_ptr& operator=(shared_ptr rhs) { swap(*this, rhs); return *this; }
  15. };
  16.  
  17. struct test {
  18. const char *c;
  19. test(const char *c):c(c){ std::cout << "construct " << c << '\n'; }
  20. ~test(){ std::cout << "destruct " << c << '\n'; }
  21. };
  22.  
  23. int main()
  24. {
  25. shared_ptr<test> t(new test("A"));
  26. {
  27. shared_ptr<test> v(new test("B"));
  28. {
  29. shared_ptr<test> s(new test("C"));
  30. shared_ptr<test> u(new test("D"));
  31. t = s;
  32. }
  33. }
  34. }
  35.  
Success #stdin #stdout 0.01s 2816KB
stdin
Standard input is empty
stdout
construct A
construct B
construct C
construct D
destruct A
destruct D
destruct B
destruct C