ありがちな例題。参照カウンタ付きスマートポインタを作ってみた。確かに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; }