c++ 智能对象声明与堆内存,请明白人指点,谢谢

定义 含有计数器的智能类模板如下:
template class SmartObjectPtr {
private:
T* p;
public:
SmartObjectPtr(T* p_=NULL) : p(p_) { if (p) p->AddRef(); };
SmartObjectPtr(const SmartObjectPtr &p_) : p((T*)p_) { if (p) p->AddRef(); };
~SmartObjectPtr(void) { if (p) p->Release(); };
SmartObjectPtr& operator=(SmartObjectPtr &p_) { return operator=((T*)p_); };
SmartObjectPtr& operator=(T* p_)
{
// must take care the order, if release p first, then add ref to
// p_ may fail if p_ == p, cause release p may delete p_ !!!
if (p_) p_->AddRef();
if (p) p->Release();
p = p_;
return this;
};
bool operator==(SmartObjectPtr &p_) { return operator==((T
)p_); };
bool operator==(T* p_) { return p == p_; };
bool operator!=(SmartObjectPtr &p_) { return operator!=((T*)p_); };
bool operator!=(T* p_) { return p != p_; };
operator T*(void) const { return p; };
operator T*(void) { return p; }; // new
T& operator*(void) { return p; };
T
operator->(void) { return p; };
T* GetAddr(void) { return p; };
bool isNull(void) { return p==NULL; }
bool notNull(void) { return p!=NULL; }
};
定义引用计数器如下:
class SmartObject {
public:
SmartObject(const char *pName="SmartObject");
virtual ~SmartObject(void);

void AddRef(void);
void Release(void);
int GetRef(void);

private:
const char *m_Name;
int m_Ref;
bool m_Valid;
protected:

};

class A:public SmartObject
{
public:
A():SmartObject("objA"){};
~A(){};
};

typedef SmartObjectPtr PA;

PA pa = new A();//这一句不理解 ---- PA pa 这是用 类型A 来实例化 SmartObjectPtr的一个对象,而new A() 则是分配一个堆内存,并返回对内存的地址。

这2者是怎么扯上关系的?如果从赋值运算符= 来解释,我加上调试信息后,也没有看到输出调用赋值运算啊。

我们一般常用 A *pa1 = new A;

上面PA pa = new A();---这个pa 本来是一个对象,变成了指针??

typedef SmartObjectPtr PA;
此时PA不是对象,而是指针了。虽然你没看到星号。

PA pa = new A();这句是重载了=这个函数。

智能指针是你在堆栈上声明的类模板,并可通过使用指向某个堆分配的对象的原始指针进行初始化。 在初始化智能指针后,它将拥有原始的指针。 这意味着智能指针负责删除原始指针指定的内存。 智能指针析构函数包括要删除的调用,并且由于在堆栈上声明了智能指针,当智能指针超出范围时将调用其析构函数,尽管堆栈上的某处将进一步引发异常。
通过使用熟悉的指针运算符(-> 和 *)访问封装指针,智能指针类将重载这些运算符以返回封装的原始指针。

class A
{
public:
A(){};
~A(){};
private:
int a;
int b;
int c;
};
void UseRawPointer()

{

// Using a raw pointer -- not recommended.

A *pa = new A;

// Use pa...

// Don't forget to delete!                                         
delete pa;//必须要手动删除                                                      

}

void UseSmartPointer()

{

PA pa=new ta(); pa 为栈空间上定义的一个对象pa,pa 被new 出来的一个堆内存初始化;
cout << sizeof(pa) << endl; 此时sizeof(pa) = 8; //64位系统 ----由此看来这个pa 确实变成了一个指针了,c++编译器悄悄的给实现的?

} // pa 在此空间自动释放