很多人知道new和delete怎么用,却不知道为什么要用,这篇博客诣在用最少的语言介绍C++中使用new 和 delete的原因。
我们知道,平时创建小型数组时,声明数组即可。
但是,当函数将读入到一个大型临时数组时,声明数组可能会浪费内存。
比如,程序要读1000个字符串,其中大的字符串包含99个字符,大部分字符串都特别短。那么直接声明1000个长度为100的字符串数组,则会浪费大量的内存。
那么问题来了,我们如何解决浪费大量内存的问题呢?
哈哈,当然是使用new和delete啦。
使用 new[ ] 操作符创建数组时,将采用动态联编(动态数组),即将在运行时为数组分配空间,其长度也将在运行阶段设置,使用完动态数组之后,delete [ ] 将会释放被占用的内存。
例 int length;
cin >> length;
int * pArray = new int [length + 1] ;
……
delete [] pArray;
(而使用数组声明来创建数组时,将采用静态联编,即数组的长度在编译阶段设定。 例 int cheat [10] ; )
下面的源代码是根据C++ Primer 5 里面的一个例子编写,与书中例子大致是一样的。
#include <stdlib.h>
#include <iostream>
#include <math.h>
using namespace std;
char * getname();
int main()
{
char * name;
name = getname();
cout << name <<endl;
delete [] name; //memory freed ,but the array are still there
name = getname();
cout << name <<endl;
delete [] name; //memory freed again
system("pause");
return 0;
}
char * getname()
{
char temp[80]; //only one
cout << "Enter last name:";
cin >> temp;
char * p = new char [strlen(temp) + 1];
strcpy(name, temp);
return name;
}
上面的程序中,函数getname(),只声明了一个长度为10的静态数组temp,用于暂存输入。
巧妙之处在于,当创建动态数组 *p时, 会根据输入到temp字符串的长度进行创建,避免浪费内存空间。
strlen() 函数用于得到一个字符串的长度, +1则是因为字符串必须以‘ \n ' (空字符)结尾,所以增加一个字符的空间用于存储空字符。
在main() 函数中,函数getname()的返回值(地址)被赋给name指针。该指针在main() 中定义,但指向getname()函数分配的内存块。
然后释放name指向的内存块后,main() 函数再次调用getname()函数。
getname()分配内存,而main()释放内存。