new和delete

1 动态与静态

所谓动态,就是只在堆里开辟内存和释放内存,而没有其余的特殊的动态的含义。

静态建立,是指程序在运行中,对象或者变量所占有的空间是在堆里面,不能随意的释放。

动态的建立和释放通过运算符new和delete来进行。注意,这俩不是关键字,是运算符,和“+”“-”这种东西一个性质

2 new运算符是干嘛的?

如果已经定义了一个类,则可以用new来动态的建立一个对象。

new 对象名;

比如,已经有一个Student类,则以下语句:

new Student;

这里,它做了两件事:

  1. 在堆里开辟一段内存空间,在这段空间里存放一个Student类的对象。
  2. 调用这个对象的构造函数,以使这个对象初始化。
  3. 返回一个指向这个对象的指针的值(就是起始地址,可不是指针变量哦)
  4. 但是直接new出来的东西既没有对象名,用户也不知道地址,是没法用的

因此,这个家伙通常这样来用:

类名 *p=new 类名;

还用Student类来说:

Student *p= new Student;

这样,new出来的东西就可以用指针p来访问了。

3 delete运算符是干嘛的

简单来说,删掉new出来的东西。但是删你也不知道删谁啊,所以一般是删掉new给的那个指针

delete p

释放p所指向的内存空间。不过要注意,这个指针p可能先指向一个new出来的对象,后来又指向了新new出来的对象,然后又可能指回去或者再指向new出来的对象,总之,删的是当前指向的那个对象,用的时候要注意,以免删错了。

实际上,delete做的事情不是这么简单,它做了以下的事情:

  1. 自动调用析构函数
  2. 释放内存空间