所以,最终p中仍然是存储了一个变量的地址,只是,这是一个“无名”变量 指向原有的某个变量,和指向一段新分配的内存空间,有什么区别呢? “原有的变量”,可以比喻成指向一间原有的,并且有主的房间。而“新分配的内存空间 则像是一个“临时建筑物”。我们必须在不用它的时候,主动将它拆迁。拆迁的工作由 delete 来完成。 当指针变量通过new,而得到一个内存地址后,我们就可以像以前的所说的,通过该指针 通过*号,而对该内存地址(一个无名的变量),进行操作 int* p new int cout *p < endl: 屏幕将输出100 20.2.2在neW时初始化内存的值 new也可以在申请内存空间时,直接设置该段内存里要放点什么 语法: 指针变量=new数据类型(初值 这样,上例可以改为 int*p= new int(100) cout < *p<< endl
所以,最终 p 中仍然是存储了一个变量的地址,只是,这是一个“无名”变量。 指向原有的某个变量,和指向一段新分配的内存空间,有什么区别呢? “原有的变量”,可以比喻成指向一间原有的,并且有主的房间。而“新分配的内存空间”, 则像是一个“临时建筑物”。我们必须在不用它的时候,主动将它拆迁。拆迁的工作由 delete 来完成。 当指针变量通过 new ,而得到一个内存地址后,我们就可以像以前的所说的,通过该指针, 通过*号,而对该内存地址(一个无名的变量),进行操作。 如: int* p = new int; *p = 100; cout << *p << endl; 屏幕将输出 100。 20.2.2 在 new 时初始化内存的值 new 也可以在申请内存空间时,直接设置该段内存里要放点什么. 语法: 指针变量 = new 数据类型(初值); 这样,上例可以改为: int* p = new int( 100); cout << *p << endl;
如果你申请的是字符类型的空间,并且想初始化为‘A char* pchar new char ('A') 20.2.3 delete 语法: delete指针变量 delete将释放指定指针所指向的内存空间 举例 int* p new Int *p=100; out < *p < endl delete p system("PAUSE") 注意,当一个指针接受 delete操作后,它就又成了一个“指向不明”的指针。尽管我们可 以猜测它还是指向“原来的房子”,然而,事实上,那座“房子”已经被 delete“拆迁”掉 了
如果你申请的是字符类型的空间,并且想初始化为‘A': char* pchar = new char('A'); 20.2.3 delete 语法: d e lete 指针变量; delete 将释放指定指针所指向的内存空间。 举例: int* p; p = new int; *p = 100; cout << *p << endl; delete p; system("PAUSE"); 注意,当一个指针接受 delete 操作后,它就又成了一个“指向不明”的指针。尽管我们可 以猜测它还是指向“原来的房子”,然而,事实上,那座“房子”已经被 delete “拆迁”掉 了
20.24实验:neW和 delete 很简单的例子 首先,在CB新建一个控制台程序。然后把上一小节的代码放到main(函数内。运行。结果 看按任意键继续 (new和 delete) 按任意键退出后,保存工程(Ctrl+ Shift+S)。 接下来我们来观察指针变量被 delete之后,所指向的内存会是什么。但,这是一件犯了C、 C++编程大忌的事:访问一个已经 delete的指针的值。如果你最近运气很差,你的CB可能会 被强行退出。所以,你明白我们为什么要先存盘了,对不? 在前面的代码中,加入以下加粗加红的一行(同时,你也应注意我的加的注释) cout<〈*p<<endl delete p //lp所指向的内存空间已经被释放 cout<<*<endl;//我们故意去访问此时p所指的内存
20.2.4 实验: new 和 delete 很简单的例子。 第一步: 首先,在 CB 新建一个控制台程序。然后把上一小节的代码放到 main()函数内。运行。结果 如下: (new 和 delete) 按任意键退出后,保存工程(Ctrl + Shift + S)。 第二步: 接下来我们来观察指针变量被 delete 之后,所指向的内存会是什么。但,这是一件犯了 C、 C++编程大忌的事:访问一个已经 delete 的指针的值。如果你最近运气很差,你的 CB 可能会 被强行退出。所以,你明白我们为什么要先存盘了,对不? 在前面的代码中,加入以下加粗加红的一行(同时,你也应注意我的加的注释): int* p; p = new int; *p = 100; cout << *p << endl; delete p; //p 所指向的内存空间已经被释放 c o ut < < * p < < e ndl; / /我们故意去访问此时 p 所指的内存
system("PAUSE") 运行结果: 4424844 青按任意键继续 (访问 delete之后的指针) 44244844??在你的机器可能不是这个数,但一定同样是怪怪的值。原来是好端端的100, 现在却成了44244844。不要问我这是为什么?昨天来时,美眉还住在这里一座别致小阁楼里, 今日故地重游,这里竟成废墟一片,依稀只见破墙上尚有:“拆!一一城建局”的字样?! new是管建房的,而 delete就一个字:拆! 请大家自行在CB上完成本实验。我没有提供本题的实际工程 20.2.5new和 delete的关系 如果只有“建房”而没有“拆房”,那么程序就会占用内存越来越多。所以,当使用new为 某个指针分配出内存空间后,一定要记得在不需要再使用时,用 delete删除。下面是一个例 子。演示new和 delete的对应使用。 //建屋和入住: 1)int* p new int(100) //使用: 2)cout < *p<< endl
system("PAUSE"); 运行结果: (访问 delete 之后的指针) 44244844??在你的机器可能不是这个数,但一定同样是怪怪的值。 原来是好端端的 100, 现在却成了 44244844。不要问我这是为什么?昨天来时,美眉还住在这里一座别致小阁楼里, 今日故地重游,这里竟成废墟一片,依稀只见破墙上尚有:“拆!——城建局”的字样?! new 是管建房的,而 delete 就一个字:拆! 请大家自行在 CB 上完成本实验。我没有提供本题的实际工程。 20.2.5 new 和 delete 的关系 如果只有“建房”而没有“拆房”,那么程序就会占用内存越来越多。所以,当使用 new 为 某个指针分配出内存空间后,一定要记得在不需要再使用时,用 delete 删除。下面是一个例 子。演示 new 和 delete 的对应使用。 //建屋和入住: 1) int* p = new int(100); //使用: 2) cout << *p << endl;
//拆: 3 delete 看,第1句,申请了4字节的内存空间,同时存入值为100的整数 第2句,在屏幕上输出入住者的值(100)。 第3句,释放内存(这4字节被系统收回准备做其它用途)。入住者呢?自然消失了。 前面举的例子都是在new一个int类型,其它类型也一样 char* a= new char(A) B cout < *a < end delete a boo lek b cout <<true"<< endl 但是这些都是简单数据类型,如果要分配数组一样的连续空间,则需要使另一对武器 neW[]和d []
//拆: 3) delete p; 看,第 1 句,申请了 4 字节的内存空间,同时存入值为 100 的整数。 第 2 句,在屏幕上输出入住者的值 (100)。 第 3 句,释放内存(这 4 字节被系统收回准备做其它用途)。入住者呢?自然消失了。 前面举的例子都是在 new 一个 int 类型,其它类型也一样: char* a = new char('A'); cout << *a << endl; *a = 'B'; cout << *a << end; delete a; bool* b = new bool; *b = true; if (*b) cout << "true" << endl; else cout << "fale" << endl; 但是这些都是简单数据类型,如果要分配数组一样的连续空间,则需要使另一对武器。 20.3 new [] 和 delete []