定义一个指针指向堆中的空间,指针所指向的空间是匿名的,只能通过该指针才能进行访问。用new关键字申请的匿名空间,必须用delete关键字进行删除。
一、在堆中创建内存
堆中用new创建的内存在程序结束时不会自动释放,通过指针来访问堆中的数据,程序结束时指针被自动释放,所以导致堆中的内存空间无法使用,也无法找到。这就是内存泄漏;所以尽量使用delete手动释放堆空间
#include<iostream>
using namespace std;
int main()
{
int *p;
p=new int;///堆,p指向创建的堆内存区域,大小与类型有关
*p=16;
cout<<"*p:"<<*p<<endl;
cout<<"p:"<<p<<endl;
delete p;
cout<<"释放堆中空间后*p的值:"<<*p<<endl;
cout<<"重新定义指针p的指向"<<endl;
p=new int;
*p=8;
cout<<"*p"<<*p<<endl;
cout<<"p:"<<p<<endl;
return 0;
}
堆中指针只能通过delete释放,并且这种释放只是释放了指针先前指向的那段内存空间,使得这段内存空间可以用来存放其他值。指针并没有被删除,这时的指针是一个指向不确定的指针,使用指针之后要将其置0,表示为空指针,此时所指向的地址是0,该地址不能内容不可访问。在栈中使用指针则不必考虑这个问题,因为栈中的指针会被系统自动释放,只有用new时才使用delete。
在如下例子中,当指针p所指向的堆中内存被delete后,指针p保存的内存地址并没有改变,但是被释放的那段内存被系统用来存放了其他值;