fork download
  1. #include <cassert>
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. template <typename T>
  7. class scoped_ptr {
  8. public:
  9. scoped_ptr() = delete;
  10. explicit scoped_ptr(T *ptr) : _ptr(ptr) {}
  11. virtual ~scoped_ptr() { reset(); }
  12.  
  13. scoped_ptr(const scoped_ptr &p) = delete;
  14. scoped_ptr &operator=(const scoped_ptr &p) = delete;
  15.  
  16. T* operator->() const { return _ptr; }
  17. T& operator*() const { return *_ptr; }
  18. T* get() const { return _ptr; }
  19. void reset(T* p = nullptr) {
  20. if (_ptr == p) {
  21. return;
  22. }
  23. delete _ptr;
  24. _ptr = p;
  25. }
  26.  
  27. private:
  28. T* _ptr;
  29. };
  30.  
  31. struct ObjectCounter {
  32. static int _object_count;
  33. ObjectCounter() {
  34. ++_object_count;
  35. }
  36. virtual ~ObjectCounter() {
  37. --_object_count;
  38. }
  39. };
  40.  
  41. int ObjectCounter::_object_count = 0;
  42.  
  43. int main() {
  44. {
  45. scoped_ptr<ObjectCounter> ptr(new ObjectCounter());
  46. assert(ObjectCounter::_object_count == 1);
  47. }
  48. assert(ObjectCounter::_object_count == 0);
  49. return 0;
  50. }
Success #stdin #stdout 0s 15232KB
stdin
Standard input is empty
stdout
Standard output is empty