C++ 中的new和delete理解与实操应用
程序员文章站
2022-04-15 15:29:37
从堆区申请空间,我们在C语言中有malloc、calloc、realloc,但是,我们在C++语言中,我们则是用new和delete来替代他们。 首先,我们来比较一下C中用来申请堆区空间的三个方法(malloc、calloc、realloc): 1.malloc返回一个void指针,C++不允许将v ......
从堆区申请空间,我们在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 不可以混搭使用...
上一篇: python基础(二)抽象