new 和 delete的使用
int i;
int *pi = new int; //int变量没有被初始化。
int *pi = new int(); //第二个变量初始化为0.
......
delete pi;
在上面的表达式中,new在堆中开创了一片内存区域。在栈中创建一个指针变量对象pi。
pi指向了这片内存,也就是地址,使用*pi获得内存的数据。
在这里堆与栈的区别大概提一下,堆是一片不连续的内存空间,可使用空间很大,而栈是一片连续的空间,可使用范围较小。
指针其实很好理解,在这里用我的个人见解举个例子:
小明今天想去广州动物园玩,但他从来没去过这个地方。
于是小明需要叫出租车,司机当然熟悉这个地址,所以可以直接把小明带到广州动物园。
在这个例子中:广州动物园是一片内存区域。它有个地址:天河东路168号。
那么司机就是一个指针变量,在小明上车后,这位司机的目标就是天河东路168号这个地址,不能随便更改地址,否则会引起小明的投诉。如果小明想参观广州动物园的风景,只要通过这位司机,就能去到。
在小明去到动物园以后,需要付钱,相当于使用delete,删除司机指向的地址,那么司机就可以为下个顾客服务了。如果不执行delete,就会造成这片内存区域可能会成为无人指向的地址,就是所谓的内存泄漏了。
很明显我们也能看到指针的好处就是一个指针变量动态指向一块地址或者指向空地址。而引用就是在这方面是明显不一样的,引用必须声明的同时被初始化,一开始就确认了地址指向,不能像指针这样动态变化。
delete pi
这里操作实际来说,就是显示地讲该对象占用的内存返还给*存储区。
在执行这一步之后,p变成了没有定义,在很多机器上,尽管它没被定义,但仍然会保留之前的所指向的对象的地址,虽然他所指向的内存已经被释放,所以还是可以调用他之前的成员变量或者成员函数。