1. #include <iostream>
    2. using namespace std;
    3. class A
    4. {
    5. private:
    6. int n;
    7. public:
    8. A(int m) : n(m) {}
    9. ~A(){}
    10. };
    11. int main()
    12. {
    13. A a(1); //栈中分配,隐式调用
    14. A b = A(1); //栈中分配,显示调用
    15. A* c = new A(1); //堆中分配
    16.   delete c;
    17. return 0;
    18. }
    1. 第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放。<br /> 采用第三种方式时,必须注意一下几点问题:
    1. new创建类对象需要指针接收,一处初始化,多处使用
    2. new创建类对象使用完需delete销毁
    3. new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间
    4. new对象指针用途广泛,比如作为函数返回值、函数参数等
    5. 频繁调用场合并不适合new,就像new申请和释放内存一样
    6. 栈的大小远小于堆
    7. 栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在 堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

    一般来说,编译器将内存分为三部分:
    静态存储区域、栈、堆。
    静态存储区主要保存全局变量和静态变量,
    栈存储调用函数相关的变量、地址等,
    堆存储动态生成的变量。在c中是指由malloc,free运算产生释放的存储空间,在c++中就是指new和delete运算符作用的存储区域。