スマートポインタ

ありがちな例題。参照カウンタ付きスマートポインタを作ってみた。確かにC++の例題として定番になるのは納得できる。実にC++的。

#include <iostream>
using namespace std;

template<class T>
class CSmart {
private:
  T* pointer;
  unsigned int *counter;

public:  
  CSmart(T* p)
    : pointer(p),
      counter(new unsigned int(1)) {
  }

  CSmart(void)
    : pointer(NULL),
      counter(new unsigned int(0)) {
  }
    
  CSmart(const CSmart<T>& p)
    : pointer(p.pointer),
      counter(p.counter) {
    (*counter)++;
  }

  CSmart operator=(CSmart<T>& src) {
    this->~CSmart();
    this->counter = src.counter;
    this->pointer = src.pointer;
    return *this;
  }

  CSmart operator=(T* src) {
    this->~CSmart();
    this->counter = new unsigned int(1);
    this->pointer = src;
    return *this;
  }

  ~CSmart() {
    if(*counter==0 || *counter==1) {
      delete counter;
      delete pointer;
    }
    (*counter)--;
  }

  operator T*() {
    return pointer;
  }
};

class test {
public:
  test() { cout << "called test::test()\n"; }
  ~test() { cout << "called test::~test()\n"; }
};

int main(void) {
  CSmart<test> testobj = new test;
  testobj = new test;
  testobj = new test;
  CSmart<test> testobj2 = new test;
  testobj = testobj2 = testobj;
}