在类的构造,析构函数中分析和回收空间的有关问题

在类的构造,析构函数中分析和回收空间的问题
1     通过一个对象调用构造函数和通过NEW分配空间后调用构造函数,这两者在分配对象成员空间的时间上有什么不一样。
比如
class   A{
      int   a
}

A   a;             //定义对象
A   *pa   =   new   A;//分配指针空间
以上两种形式分别在什么时候分配了成员空间。

2     分别通过指针和对象变量调用类析构函数时,其成员空间何时被回收。
class   A{
            private:
                            int   value;
            public:
                          A(int   a):value(a){}
                          void   Assign(const   A   &);
                          int   getvalue(){return   value;}                  
};

void   A::Assign(const   A   &a)
{
          if   (this   !=   &a)
          {
                            this-> ~A();                         //调用了析构函数
                            new   (this)   A(a);
          }
}

int   main()
{
        A   a1(10);
        A   a2(100);
        cout < <a1.getvalue() < <endl;
        a1.Assign(a2);
        cout < <a1.getvalue() < <endl;
        system( "pause ");
        return   0;
}

调用析构函数后成员空间不会立即释放吗?
如果不立即释放,要等到什么时候才会释放?
通过对象变量和指针变量调用析构函数有没有区别?

------解决方案--------------------
召唤 taodm 指点 C++ Primer 章节……
------解决方案--------------------

A a; //定义对象
这个是在定义的地方,如果是函数内定义,那么在进入这个函数的时候分配好空间,在A a的时候调用构造函数。
A *pa = new A;在new的时候分配空间。
------解决方案--------------------
1.
A a;//对象在栈上分配.
A *p = new A;//对象分配在堆上.

2.
析构函数本身来没承诺对空间的回收.一般是程序员在其中释放在构造函数中NEW得的空间.至于对"存放本类对象的非静态数据成员的空间"的释放则完全是调用析构函数之后的事.也就是说为你上面的那个类定义析构函数没有任何用处.

------解决方案--------------------
(1)引用高手的话
char s1[] = "aaaaaaaaaaaaaaa ";
char *s2 = "bbbbbbbbbbbbbbbbb ";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
=====================================
------解决方案--------------------
引用谭浩强的书的一句话:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给其他新对象使用!
LZ要多温习啊