关于类的对象与指针?该怎么解决

关于类的对象与指针?
关于类的对象与指针,还是不太明白
如下例:

CString   strA( "123 ");
CString   *strB   =   new   CString( "123 ");

strA与strB到底有什么区别,
我在书上看到,说对于复杂类型变量,实际上也是指针,那么也就是说变量strA是指向对象strA的指针,变量strB也是指向对象strB的指针,也就是说,strA的值是strA对象的起始地址,strB的值是strB对象的起始地址,那这两者到底有什么区别呢?

是不是所有复杂类型的变量,都是指针,它的值是不是都是该变量的起始地址呢?


------解决方案--------------------
第一行,是在栈上分配
第二行,是在堆上分配

------解决方案--------------------
strA,*strB都是对象的地址,该地址指向堆中的某种地方
区别是:
strA 这个对象变量在栈中,随着程序段的结束,对象会自动销毁(出栈),同时调用CString的析构函数,清除CString在堆中分配的数据空间
strB 这只是一个指针,不是CString 对象,真实的对象变量(*strB)在堆中,因此当程序段结束,如果不执行delete,strB指针被销毁,但是它指向的对象将成为孤魂野鬼 (内存泄露)


------解决方案--------------------
CString有一个成员变量是一个字符指针,不过好像“123”不仅仅在堆上分配空间,而且在全局数据区内也分配,所以CString析构以后,全局数据区的“123”就没办法清除了^_^
------解决方案--------------------
如果你把对象名称看作对象的地址,那么:
strA 是一个CString对象的地址。
StrB 是一个指针对象的地址,该指针对象的值,是一个CString对象的地址。

实际上,在C++中,strA的地址,要写做 &strA。
------解决方案--------------------
楼上全错~~
strA是strA对象的首地址.程序中把它当作一个对象使用,不当作指针,所以strA.Format(...是正确的.
内存模型:strA 123
strB是指向new出来的对象的首地址的指针,而这个new出来的对象和strA是一样的对象,但是使用时却需要用strB-> Format(...。
内存模型:strB-> aobj 123
与在栈上还是在堆上并无关系。
这样写会更清楚:
CString *pStrB=new CString( "123 ");
------解决方案--------------------
to StarManJhh()
怎么可以说“与在栈上还是在堆上并无关系。”?
你可以自行管理程序段的栈空间吗?
但是堆是一个 "free store ",是需要管理的
new操作符,总是在堆上进行的,是需要管理的

类的结构可以简单,也可以很复杂,其存储管理差异很大
一个程序的结构也一样,可能是独立的,也可能共用宿主程序的存储空间
所以对于堆栈的理解在复杂的程序设计中是很重要的