doclist 阅读(129) 评论(0)
一、new和delete
  程序运行时,计算机的内存被分为4个区域:程序代码区,全程数据区,栈和堆。其中堆上的内存可以被用户自由分配和释放。C语言中提供了malloc(还有calloc和realloc)和free函数来进行动态内存管理。C++中则提供了new和delete运算符来进行动态内存管理。因为new和delete是运算符,所以性能要更高效(没有函数调用时的开销),使用更灵活。

1、用new分配内存的基本形式
   指针变量名=new 类型;
  在程序执行过程中,运算符new从堆上分配一块与类型字节数相等的内存空间,并将这块空间的首地址存到指针变量中。
  例:
    char *p;
    p=new char; //new动态分配存放一个字符的空间,并将这块空间的首地址赋给p
  运算符delete用于释放运算符new分配的的存储空间。其基本形式为:
    delete 指针变量名;
    delete p;         //将new分配的空间进行释放

2、用new为数组动态内存分配,这时需要在类型名后面加上数组的大小。其形式如下:
      指针变量名=new 类型名[数组大小];
   例:
     int *p=new int[5];     //new分配了一个有5个元素的整型数组
  释放动态分配的数组存储区时,可以使用delete运算符。其形式如下:
     delete []指针变量名;   //指针变量名前加一对[],无需指定大小,表示释放的是数组
    例:delete []p;    //释放了new开辟的具有5个元素的整型数组

3、用new在为简单变量进行分配空间的同时,可以进行初始化。其形式如下:
      指针变量名=new 类型名(初始值);
   例:int *p;
     p=new int(20);    //分配一个整型,并将20作为这块空间的初始值
注意:运算符new不能对动态分配的数组存储区进行初始化。

二、new、delete和malloc、free的异同。
1、运算符new可以自动计算所要分配的空间的大小。
2、new能够自动返回正确的指针类型,不需要用户对返回指针进行强制类型转换。
3、new是运算符,效率更高。
4、new分配的空间只能用显示的用delete释放。否则会发生内存泄漏。
5、new如果分配不成功的话,会返回一个空指针。