c++中的new关键字
来源:互联网 发布:杭州网络推广公司 编辑:程序博客网 时间:2024/05/20 07:32
带有“[]”的new和delete
我们经常会通过new来动态创建一个数组,例如:
char* s = new char[100];
……
delete s;
严格的说,上述代码是不正确的,因为我们在分配内存时使用的是new[],而并不是简单的new,但释放内存时却用的是delete。正确的写法是使用delete[]:
delete[] s;
但是,上述错误的代码似乎也能编译执行,并不会带来什么错误。事实上,new与new[]、delete与delete[]是有区别的,特别是当用来操作复杂类型时。假如针对一个我们自定义的类MyClass使用new[]:
MyClass* p = new MyClass[10];
上述代码的结果是在堆上分配了10个连续的MyClass实例,并且已经对它们依次调用了构造函数,于是我们得到了10个可用的对象,这一点与Java、C#有区别的,Java、C#中这样的结果只是得到了10个null。换句话说,使用这种写法时MyClass必须拥有不带参数的构造函数,否则会发现编译期错误,因为编译器无法调用有参数的构造函数。
当这样构造成功后,我们可以再将其释放,释放时使用delete[]:
delete[] p;
当我们对动态分配的数组调用delete[]时,其行为根据所申请的变量类型会有所不同。如果p指向简单类型,如int、char等,其结果只不过是这块内存被回收,此时使用delete[]与delete没有区别,但如果p指向的是复杂类型,delete[]会针对动态分配得到的每个对象调用析构函数,然后再释放内存。因此,如果我们对上述分配得到的p指针直接使用delete来回收,虽然编译期不报什么错误(因为编译器根本看不出来这个指针p是如何分配的),但在运行时(DEBUG情况下)会给出一个Debug assertion
我们经常会通过new来动态创建一个数组,例如:
char* s = new char[100];
……
delete s;
严格的说,上述代码是不正确的,因为我们在分配内存时使用的是new[],而并不是简单的new,但释放内存时却用的是delete。正确的写法是使用delete[]:
delete[] s;
但是,上述错误的代码似乎也能编译执行,并不会带来什么错误。事实上,new与new[]、delete与delete[]是有区别的,特别是当用来操作复杂类型时。假如针对一个我们自定义的类MyClass使用new[]:
MyClass* p = new MyClass[10];
上述代码的结果是在堆上分配了10个连续的MyClass实例,并且已经对它们依次调用了构造函数,于是我们得到了10个可用的对象,这一点与Java、C#有区别的,Java、C#中这样的结果只是得到了10个null。换句话说,使用这种写法时MyClass必须拥有不带参数的构造函数,否则会发现编译期错误,因为编译器无法调用有参数的构造函数。
当这样构造成功后,我们可以再将其释放,释放时使用delete[]:
delete[] p;
当我们对动态分配的数组调用delete[]时,其行为根据所申请的变量类型会有所不同。如果p指向简单类型,如int、char等,其结果只不过是这块内存被回收,此时使用delete[]与delete没有区别,但如果p指向的是复杂类型,delete[]会针对动态分配得到的每个对象调用析构函数,然后再释放内存。因此,如果我们对上述分配得到的p指针直接使用delete来回收,虽然编译期不报什么错误(因为编译器根本看不出来这个指针p是如何分配的),但在运行时(DEBUG情况下)会给出一个Debug assertion
- c++中的new关键字
- java中的关键字new
- 关于C++NEW关键字
- Memo: C# 中的new关键字
- C++-关键字new和delete
- C#中的new关键字的使用
- C#中的Override 和 New 关键字
- oracle中的NEW和OLD关键字说明
- java中的Class对象、new关键字
- C#中的override和new关键字
- C#.net 关键字之new老司机教学 net new
- C语言中的关键字
- C语言中的关键字
- C语言中的关键字
- C中的volatile关键字
- C语言中的关键字
- C语言中的关键字
- C语言中的关键字
- Understanding nil?, empty? and blank? in Ruby and Rails
- 入门学习视频
- DesToon后台管理功能模板显示问题
- delete与delete[]的区别和使用方法
- PO等-对这些缩写详细介绍:PO BO VO DTO POJO DAO概念及其作用(附转换图)
- c++中的new关键字
- Oracle EBS中查询Profile的各种SQL
- Workmake所用W语言介绍
- pthread库学习(2): 线程的同步,使用信号量
- js操作文件
- ffmpeg 编译指令的理解
- pthread_cleanup_push() pthread_cleanup_pop()
- 2012.06.11
- 彻底理解面向对象的多态