new和delete
1 动态与静态
所谓动态,就是只在堆里开辟内存和释放内存,而没有其余的特殊的动态的含义。
静态建立,是指程序在运行中,对象或者变量所占有的空间是在堆里面,不能随意的释放。
动态的建立和释放通过运算符new和delete来进行。注意,这俩不是关键字,是运算符,和“+”“-”这种东西一个性质
2 new运算符是干嘛的?
如果已经定义了一个类,则可以用new来动态的建立一个对象。
new 对象名;
比如,已经有一个Student类,则以下语句:
new Student;
这里,它做了两件事:
- 在堆里开辟一段内存空间,在这段空间里存放一个Student类的对象。
- 调用这个对象的构造函数,以使这个对象初始化。
- 返回一个指向这个对象的指针的值(就是起始地址,可不是指针变量哦)
- 但是直接new出来的东西既没有对象名,用户也不知道地址,是没法用的
因此,这个家伙通常这样来用:
类名 *p=new 类名;
还用Student类来说:
Student *p= new Student;
这样,new出来的东西就可以用指针p来访问了。
3 delete运算符是干嘛的
简单来说,删掉new出来的东西。但是删你也不知道删谁啊,所以一般是删掉new给的那个指针
delete p
释放p所指向的内存空间。不过要注意,这个指针p可能先指向一个new出来的对象,后来又指向了新new出来的对象,然后又可能指回去或者再指向new出来的对象,总之,删的是当前指向的那个对象,用的时候要注意,以免删错了。
实际上,delete做的事情不是这么简单,它做了以下的事情:
- 自动调用析构函数
- 释放内存空间