关于数组

来源:互联网 发布:北京110网络报警平台 编辑:程序博客网 时间:2024/06/05 03:13

       对于一维字符数组,其动态创建的正确方法应为:

/////////////////////////////////////////////////////////////////////////////////                     

char *p=new char[512];               // 分配空间

...

delete []p;                                      //删除数组空间

////////////////////////////////////////////////////////////////////////////////

       动态创建的数组要注意:因为对于字符数组来说,并不在乎自身结尾处有无 ‘\0’结束标志,故不能将其当做字符串。应该按照 delete []p; 来进行释放。它不会删除不属于它的内存单元,不会泄露内存单元(相当于你明确告诉编译器:这是在释放一个字符数组,接下来的活,编译器将自己完成)。

       对于其他类型的一维数组,其创建方法与上述一维字符数组相同,记住,释放时最好用 delete [],否则,很可能会造成内存泄露。例如:

////////////////////////////////////////////////////////////////////////////////

int *k=new int[125];

...

delete k;

/////////////////////////////////////////////////////////////////////////////////

        按上述方法来释放 k 指向的125个int内存空间,结果将是:只释放了该数组的第一个元素的空间,后面的124个int空间全丢失了,可以换句话说,泄露了。原因在于:编译器不会把k 看做是指向int类型数组的指针,而仅仅是一个int指针。所以,正确的删除方式应该是 

delete []k;

        其实,最最根本的原因在于:delete语句执行时确认k是否指向一个数组以及查找数组大小信息的过程,将会极大的影响它的执行效率,所以编译器在编译时,只有 '[]' 出现在指针前面时,才会去查找数组的大小信息,然后依据这个大小信息来释放动态内存,否则,它便只删除一个对象。




        对于多维数组,不能简单的使用一个元素类型的指针来接收动态创建的多维数组的返回地址。因为:一个多维数组在语义上并不等价于一个指向其元素类型的指针,它等价于一个“指向数组的指针”。如下:

////////////////////////////////////////////////////////////////////////////////

char *p1=new char[5][3];                //错误!语义不等价

int    *p2=new int[4][6];                    //错误!语义不等价

char (*p3)[4]=new char[5][4];          //正确!退化第一维,语义等价

int    (*p4)[5]=new int[3][5];              //正确!退化第一维,语义等价

char (*p5)[5][7]=new char[2][5][7];   //正确!退化第一维,语义等价

...

// 同样的道理,按下面方法来删除动态创建的多维数组的方法就是错误的!

delete [][]p3;             //错误!不存在这样的语构造

delete [][]p4;             //错误!不存在这样的语构造

delete [][][]p5;           //错误!不存在这样的语构造

//我们应该从多维数组的语义出发来确定如何释放它们。即:把多维数组转化为等价的一维数组,然后就可以使用 delete[] 来删除了!所以,正确的删除方法应该是这样的:

delete []p3;               //正确

delete []p4;               //正确

delete []p5;               //正确

/////////////////////////////////////////////////////////////////////////////////


1 0
原创粉丝点击