析构函数的调用两次,这是为什么?
#include<stdio.h>
#define TRACE printf
class RefCount
{
int crefs;
public:
RefCount(void) { crefs=0; }
~RefCount() { TRACE("goodbye(%d)\n",crefs); }
void upcount(void)
{
++crefs;
TRACE("up to %d\n",crefs);
}
void downcount(void)
{
if(--crefs==0)
delete this;
else
TRACE("downto %d\n",crefs);
}
};
class Sample:public RefCount
{
public:
void doSomething(){ TRACE("Did somthing\n");}
};
template<class T>
class Ptr
{
T* p;
public:
Ptr(T* p_):p(p_) { p->upcount(); }
~Ptr(void) { p->downcount(); }
operator T*(void) { return p; }
T& operator*(void) { return* p; }
T* operator->(void) { return p; }
Ptr& operator=(Ptr<T>& p_)
{
return operator=((T*)p_);
}
Ptr& operator=(T* p_)
{
p->downcount();
p=p_;
p->upcount();
return* this;
}
};
void main()
{
Ptr<Sample> p=new Sample;
Ptr<Sample> p2=new Sample;
p=p2;
p->doSomething();
}
针对上述程序我有两个疑问:
1.p_这个参数的值如何引入?
2.在main结束前调用两次析构函数?