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