《C++ Primer Plus》第五版 程序清单4.22 delete.cpp
来源:互联网 发布:二级域名 端口号 编辑:程序博客网 时间:2024/06/05 03:41
//程序清单4.22 delete.cpp#include <iostream>#include <cstring>using namespace std;char * getname(void);int main(){ char * name; name = getname(); cout << name << " at " << (int *)name << endl; delete [] name; name = getname(); cout << name << " at " << (int *)name << endl; delete [] name; return 0;}char * getname(){ char temp[80]; cout << "Enter last name: "; cin >> temp; char * pn = new char[strlen(temp) + 1]; strcpy(pn, temp); return pn;}
运行结果:
Enter last name: philipphilip at 0x3d65a8Enter last name: johnjohn at 0x3d65a8Process returned 0 (0x0) execution time : 18.201 sPress any key to continue.
分析:
- 该程序的目的是为了节省内存。首先将字符串读入到一个大型的临时数组中,然后用new[]创建一个刚好能够存储该输入字符串的内存块,并返回一个指向该内存块的指针。当getname()运行完,存储临时数组的栈中的内存将被自动释放,因此分配的内存即为刚好可以存储字符串的内存,节约了内存。
- 因为指针ps指向的内存是由new分配的数组,而指针name=ps,因此指针name指向的内存也是由new分配的数组,所以在delete该内存时需要使用
delete[] name
。 - 在语句
cout << name << " at " << (int *)name << endl;
一般来说,如果给cout提供一个指针,它将打印地址。但如果指针的类型为char ,则cout将显示指向的字符串。如果要显示的是字符串的地址,则必须将这种地址强制转化为另一种指针类型,例如(int )。 - 对于字符数组,它的结束符是系统默认给加的空字符”\0”,目的是,在使用该字符数组时,其实系统只是记住了指向该字符数组首元素的指针的值,然后顺序打印,直到遇到空字符”\0”。因此,我们在将temp[]复制到pn时,对pn申请的地址长度为strlen(temp) + 1。测试:
char a[10] = "ab\0cd"; cout << a << endl; // 打印结果为ab
- 关于strlen()和sizeof()
char str[20]=”0123456789搜索”;
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20; - 该程序存在的问题:将new和delete放在不同的函数中通常并不是个好办法,因为这样很容易忘记使用delete。该例子中这样做只是为了方便。
.
阅读全文
0 0
- 《C++ Primer Plus》第五版 程序清单4.22 delete.cpp
- 第1周 C Primer Plus(第五版) 数组 程序清单10.1例题
- 第1周 C Primer Plus(第五版) 多维数组 程序清单10.7例题
- C Primer Plus 第五版 前四章程序清单
- C Primer Plus 第五章 程序清单and习题——2015.4.21
- C Primer Plus 第五版
- C Primer Plus 程序清单及注释解释
- C Primer Plus(第五版)中文版勘误
- (c primer plus第五版) 学习笔记
- <<C++Primer PLus 第五版>>读书笔记1
- <<C++Primer PLus 第五版>>读书笔记2
- <<C++Primer PLus 第五版>>读书笔记3
- C++Primer PLus 第五版读书笔记
- <<C++Primer PLus 第五版>>读书笔记4
- <<C++Primer PLus 第五版>>读书笔记3
- <<C++Primer PLus 第五版>>读书笔记2
- <<C++Primer PLus 第五版>>读书笔记1
- C Primer Plus 第五版 课后练习
- [eclipse]Syntax error on token ";",{ expected after this token
- vsFTP部署
- 简单的表格
- C++ 写时拷贝
- Mac os 10.12.5 item2+Shuttle+sshpass模拟Xshell部分功能
- 《C++ Primer Plus》第五版 程序清单4.22 delete.cpp
- ListView应用步骤
- Xml1
- 科技有意思丨iPhone8新添AR功能?!你的肾还保得住吗
- Linux中断及其相关内容.
- 刘汝佳--蛇形填数
- RxJava的简介
- 自适应样式
- Genymotion模拟器常见问题总结