1 .静态数组位于内存中的堆栈区域中,并且在定义时已为堆栈分配了固定大小,不能在运行时调整此大小。 例如,int a[10];
动态数组来自malloc或new,位于内存的堆空间中,其大小在运行时给出,可以更改为:
int *a;
int m_num=10;
a=new int[m_num ];
2 .静态数组的大小在编译期间确定并分配,其内存在使用结束后由计算机自动释放,高效的动态数组在程序运行时由程序员根据实际需要从堆内存动态申请,使用结束后由程序员释放
3 .在函数内部声明的静态数组由于生存期问题,函数调用完成后将释放内部变量占用的内存。 如果要从函数返回数组,可以在函数中用new动态创建数组,并返回起始地址。 静态数组在堆栈中申请,函数中的局部变量也在堆栈中。 另外,由于new动态数组是在堆中分配的,因此在函数返回后,堆栈中的已申请内存将自动释放,但堆中的已申请内存必须有delete才能自动释放。
另外:
有两种方法可以在堆中申请空间: c的malloc和c的new。
在基本的数据类型数组中,这两个区域的申请方法没有很大的区别。
int *pa、*pb;
pa=(int* ) malloc ) sizeof (int ) ) 10 ); //正确
pb=new int[10]; //正确
但是,对于类数组,必须在new而不是malloc中分配空间。
我的班级*pb,*pb;
pa=(myclass* ) malloc(sizeof ) myclass ) * 10 ); //错误
pb=new MyClass[10]; //正确
之所以采用malloc调用,是因为只分配了sizeof(myclass ) 10大小的空间,其他什么都没做。 new调用不仅调用分配空间,还调用每个MyClass的构造函数。 构造函数对类很重要,如果在不调用构造函数的情况下使用该类的变量,则可能会出现意外的结果。
注意:在new []中申请空间后,必须在delete []中释放空间。
为什么不是delete,而是delete []?
对于基本数据类型的数组,delete只释放pa[0]的空间,而delete []正确释放所有空间。
对于类数组,delete只调用pa[0]的析构函数并放置了空间。
delete []调用了所有元素的析构函数,并正确释放了所有空间。