#include <vld.h>
#include <iostream>
#include <time.h>
using namespace std;
class Base
{
public:
Base():m_iPtrCount(0){}
virtual ~Base(){}
void Show(){ cout<<"Base"<<endl; }
private:
void RegisterGuardian(){ m_iPtrCount++; }
void CancelGuardian()
{
m_iPtrCount--;
if( m_iPtrCount<=0)
delete this;
}
int m_iPtrCount;
friend class DeclareGuardian;
};
class DeclareGuardian
{
public:
DeclareGuardian(Base* _pT):m_pT(_pT)
{
m_pT->RegisterGuardian();
}
DeclareGuardian(const DeclareGuardian& _dg)
{
m_pT = _dg.m_pT;
m_pT->RegisterGuardian();
}
~DeclareGuardian()
{
m_pT->CancelGuardian();
}
Base* operator()()
{
return m_pT;
}
private:
DeclareGuardian& operator= (DeclareGuardian& other){ return *this; }
Base* m_pT;
};
class WorkThread
{
public:
WorkThread(DeclareGuardian _dg):m_dg(_dg){}
void operator()(){ /*cout<<"Run WorkThread"<<endl;*/ delete this; }
private:
~WorkThread(){}; //资源自理
DeclareGuardian m_dg;
};
void CreatThread(WorkThread* _pWork)
{
(*_pWork)();
}
void main()
{
srand(time(0));
for(int i=0; i<10000; i++)
{
Base* pa = new Base();
WorkThread* pWork1 = new WorkThread(DeclareGuardian(pa));
WorkThread* pWork2 = new WorkThread(DeclareGuardian(pa));
int r = rand()%2;
if( 0 == r)
{
CreatThread(pWork1);
CreatThread(pWork2);
}
else
{
CreatThread(pWork2);
CreatThread(pWork1);
}
}
system("pause");
}
/*
class A{};
//A tg()
//{
// cout<<"dsdf"<<endl;
// return A();
//}
A tg();
tg();
注意: A a(); 不等于 A a; 前者是一个函数声明(可通过调用该函数验证)。 后者是定义一个无构造参数的A对象。
*/