c++中new与delete的用法总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zcawesome/article/details/78777832
new运算符使用的一般格式为   new 类型 [初值]   用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)   
new int(100);//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址  
new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址   

new int[5][4];//开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址

float *p=new float (3.14159);//开辟一个存放单精度数的空间,并指定该实数的初值为//3.14159,将返回的该空间的地址赋给指针变量p   

delete运算符使用的一般格式为   delete [ ]指针变量   
例如要撤销上面用new开辟的存放单精度数的空间(上面第5个例子),应该用   delete p;  
前面用“new char[10];”开辟的字符数组空间,如果把new返回的指针赋给了指针变量pt,则应该用以下形式的delete运算符撤销该空间:   
  delete [] pt;//在指针变量前面加一对方括号,表示是对数组空间的操作   

开辟空间以存放一个结构体变量例子。   

[cpp] view plain copy

    #include <iostream>     
    #include <string>     
    using namespace std;  
       struct Student//声明结构体类型Student  
       {  
                    string name;     
             int num;     
             char sex;  
       };  
     int main( )     
    {  
            Student *p; //定义指向结构体类型Student的数据的指针变量  
       p=new Student;//用new运算符开辟一个存放Student型数据的空间  
       p->name=″WangFun″; //向结构体变量的成员赋值  
       p->num=10123;  
       p->sex='m';  
           cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;//输出各成员的值  
       delete p;//撤销该空间  
      return 0;     
    }     
    运行结果为   Wang Fun 10123 m  
    指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了<span style="color:#FF0000;">p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身</span>(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。  
    #include<iostream>  
    using namespace std;  
    int main(){  
        int *a=new int(10);  
        cout<<*a;  
        delete a;  
        cout<<a;  
        return 0;  
    }   
    输出结果为 100xe42f00  
使用注意事项

1. new 和delete都是内建的操作符,语言本身所固定了,无法重新定制,想要定制new和delete的行为,徒劳无功的行为。

2. 动态分配失败,则返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。

3. 指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。

4. 内存泄漏(memory leak)和重复释放。new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。

5. 动态分配的变量或对象的生命期。我们也称堆空间为自由空间(free store),但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放,往往会出错。

6. 要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。

    用new和delete可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。

开辟空间以存放一个结构体变量例子。   

[cpp] view plain copy

    #include <iostream>     
    #include <string>     
    using namespace std;  
       struct Student//声明结构体类型Student  
       {  
                    string name;     
             int num;     
             char sex;  
       };  
     int main( )     
    {  
            Student *p; //定义指向结构体类型Student的数据的指针变量  
       p=new Student;//用new运算符开辟一个存放Student型数据的空间  
       p->name=″WangFun″; //向结构体变量的成员赋值  
       p->num=10123;  
       p->sex='m';  
           cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;//输出各成员的值  
       delete p;//撤销该空间  
      return 0;     
    }     
    运行结果为   Wang Fun 10123 m  
    指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了<span style="color:#FF0000;">p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身</span>(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。  
    #include<iostream>  
    using namespace std;  
    int main(){  
        int *a=new int(10);  
        cout<<*a;  
        delete a;  
        cout<<a;  
        return 0;  
    }   
    输出结果为 100xe42f00  
使用注意事项

1. new 和delete都是内建的操作符,语言本身所固定了,无法重新定制,想要定制new和delete的行为,徒劳无功的行为。

2. 动态分配失败,则返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。

3. 指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身(指针p本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放),释放堆空间后,p成了空指针。

4. 内存泄漏(memory leak)和重复释放。new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。

5. 动态分配的变量或对象的生命期。我们也称堆空间为自由空间(free store),但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放,往往会出错。

6. 要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问。

    用new和delete可以动态开辟和撤销地址空间。在编程序时,若用完一个变量(一般是暂时存储的数据),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它。

猜你喜欢

转载自blog.csdn.net/zcawesome/article/details/78777832
今日推荐