今天情人节,有没对象的吗?假设你不知道new怎么用,每个人都有两种身份,一种没对象的人,这个时候new一个对象给你,一种是有对象的人,这个delete对象。等你学完这个new和delete知识点,无论何时何地,你都能new或者delete一个对象。
一.关于new与delete
new和malloc一样,就是告诉计算机开辟一段新的空间,但是和一般的声明不同的是,new开辟的空间在堆上,而一般声明的变量存放在栈上。new开辟空间和普通变量开辟空间不同,比如为普通变量开辟的内存(在栈区),在函数体里面使用完之后就会立即被操作系统释放,而new开辟的内存(在堆区)在函数结束的时候必须由程序员手动释放,如果这块内存不用了,用delete运算符释放它
二.使用堆区的内存有四个步骤:
1)声明一个指针;
2)用new运算符向系统申请一块内存,让指针指向这块内存;
3)通过对指针解引用的方法,像使用变量一样使用这块内存;
4)如果这块内存不用了,用delete运算符释放它。
注意: 如果申请成功,返回一个地址;如果申请失败,返回一个空地址;
释放内存的语法:delete 地址;
释放内存不会失败(还钱不会失败)。
三.申请内存的语法:
- new 数据类型
- new 数据类型(初始值)
- new 数据类型[常量表达式]
四.示例:
int * p1=new int;//new一个整形对象 int* p2 = new int(2); // *p2初始化值是2,这样直接在定义后面初始化是可以的 cout << "*p=" << *p << endl; *p = 8;//解引用修改p所直指向的值也是可以的 cout << "*p=" << *p << endl; delete p; //如果不想使用指针,可以定义一个变量,在new之前用“*”表示new出来的内容 int q = *new int; q = 1; cout << q << endl; int *p3=new int[1000] //申请1000个单位内存空间 int* example2() { //当new一个数组时,同样用一个指针接住数组的首地址 int *q = new int[3]; for(int i=0; i<3; i++) q[i] = i; return q; } struct student { string name; int score; }; student* stu() { //这里是用一个结构体指针接住结构体数组的首地址 //对于结构体指针,个人认为目前这种赋值方法比较方便 student *stud = new student[3]{{"张三", 100}, {"李四", 100}, {"王五", 100}}; return stud; }
注意:
- 动态分配出来的内存没有变量名,只能通过指向它的指针来操作内存中的数据。
- 如果动态分配的内存不用了,必须用delete释放它,否则有可能用尽系统的内存。
- 动态分配的内存生命周期与程序相同,程序退出时,如果没有释放,系统将自动回收。
- 就算指针的作用域已失效,所指向的内存也不会释放。
- 用指针跟踪已分配的内存时,不能跟丢。