C++ 中的new和delete理解与实操应用
2020-03-19 16:01:52来源:博客园 阅读 ()
C++ 中的new和delete理解与实操应用
从堆区申请空间,我们在C语言中有malloc、calloc、realloc,但是,我们在C++语言中,我们则是用new和delete来替代他们。
首先,我们来比较一下C中用来申请堆区空间的三个方法(malloc、calloc、realloc):
1.malloc返回一个void指针,C++不允许将void赋值给其他任何指针,必须要强转。
2.malloc可能会申请内存失败,所以必须判断返回值来确保内存分配成功。
3.malloc不会调用构造函数,free不会调用构析函数(这是最最最重要的一点...)。
而...new 和delete都有两个作用,如下
1,new有2个作用
- 开辟内存空间。
- 调用构造函数。
2,delete也有2个作用
- 释放内存空间
- 调用析构函数。
清楚了C++为什么用new和delete后,我们再来明白new的用法-------
1.new 给基本类型申请空间
1 void tesk1() 2 { 3 //基本类型 4 int *p = NULL; 5 6 //p = (int *)calloc(1,sizeof(int)); 7 //p = new int(100); --->*p = 100; 8 9 p = new int; 10 *p = 100; 11 cout<<"*p="<<*p<<endl;//100 12 13 //free(p);释放 14 delete p; 15 }
2.new 申请基本类型数组空间
1 void tesk1() 2 { 3 //申请 int数组 4 int *arr = NULL; 5 //arr = (int *)calloc(5,sizeof(int)); 6 arr = new int[5];//申请空间的时候内容初始化,值随机 //arr = new int[5]{1,2,3,4,5};内容不随机 7 8 int i = 0; 9 for(i=0;i<5;i++) 10 { 11 cout<<arr[i]<<" "; 12 } 13 cout<<endl; 14 15 //释放 new时加[] delete也必须加[] 16 delete [] arr; 17 } 18 int main(int argc, char *argv[]) 19 { 20 tesk1(); 21 return 0; 22 }
注意:
new 没有加[] delete释放的时候就不加[]
new 加 [] delete释放的时候加 []
3、new delete 给类对象申请空间
有一些地方会用new和delete申请对象数组
我们先简单的了解一下对象数组----本质是数组,只是数组的每个元素是类的对象
举两个例子...
1...
1 void tesk3() 2 { 3 //对象数组 arr1 是数组,每个元素是Person类型的对象 4 //定义对象数组的时候,系统会自动给数组中的每个元素调用构造函数 5 //自动调用无参构造 6 Person arr1[5]; 7 } 8 //会调用5次无参函数和5次析构函数
2.如果想让对象数组中的元素调用有参构造,必须人为使用有参构造初始化...
1 void tesk5() 2 { 3 //对象数组 arr1是数组,每个元素是Person类型的对象 4 //定义对象数组的时候,系统会自动给数组中的每个元素调用析构函数 5 //人为 为元素调用有参析构 6 //初始化部分,调用有参构造为初始化部分自动调用默认构造(无参构造) 7 Person arr1[5] = {Person("lucy",18),Person("bob",20)}; 8 //arr1[0] 第0个元素 就是Person的对象 9 arr1[0].showPerson(); 10 arr1[1].showPerson(); 11 }
3、用new delete申请 对象数组
1 void tesk06() 2 { 3 //第一种方式 4 Person *arr = NULL; 5 arr = new Person[5];//调用无参构造 6 7 delete [] arr; 8 9 //第二种方式: 10 //初始化的元素,调用有参构造,没有初始化的调用无参构造 11 Person *arr2 = new Person[5]{Person("lucy",18),Person("bob",,20)}; 12 (*(arr2+0)).showPerson(); 13 arr[0].showPerson(); 14 (arr2+1)->showPerson(); 15 delete [] arr2; 16 }
4.尽量不要delete 释放 void *(void *万能指针...)
5、malloc、free和new、delete 不可以混搭使用...
原文链接:https://www.cnblogs.com/loliconinvincible/p/12525718.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:线段树学习资料
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash