今天情人节,有没对象的吗?假设你不知道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释放它,否则有可能用尽系统的内存。
动态分配的内存生命周期与程序相同,程序退出时,如果没有释放,系统将自动回收。
就算指针的作用域已失效,所指向的内存也不会释放。
用指针跟踪已分配的内存时,不能跟丢。