指针和自由存储空间复习(重点复习new和delete)
使用new来分配内存
在运行阶段分配未命名的内存以存储值
为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:typeName * pointer_name = new typeName;
需要在两个地方指定数据类型:用来指定需要什么样的内存和用来声明合适的指针。
使用delete释放内存
一定要配对地使用new和delete
使用delete时,后面要加上(最初是由new分配的)指向内存块的指针。
int* ps=new int;
...
delete ps;
这将释放ps指向的内存,但不会删除指针ps本身。(可将ps重新指向另一个新分配的内存块)
使用new来创建动态数组
将数组的元素类型
和元素数目
告诉new即可。
int* psome=new int [10];//创建一个包含10个int元素的数组
new运算符返回第一个元素的地址
当程序使用完new分配的内存块时,应使用delete释放它们。(如果使用new时不带方括号,使用delete时也不带方括号;如果使用new时带方括号,使用delete时也带方括号)
delete [] psome;
使用new和delete时,应遵循以下规则:
·不要使用delete来释放不是new分配的内存
·不要使用delete释放同一个内存块两次
·如果使用new[]为数组分配内存,则应使用delete[]来释放
·如果使用new为一个实体分配内存,则应使用delete(没有方括号)来释放
·对空指针应用delete是安全的
使用动态数组
把指针当作数组名使用即可
//arraynew.cpp
#include <iostream>
int main()
{
using namespace std;
double* p3=new double [3];
p3[0]=0.2;
p3[1]=0.5;
p3[2]=0.8;
cout<<"p3[1] is "<<p3[1]<<".\n";
p3=p3+1;//使p3指向第2个元素而非第1个元素
cout<<"now p3[0] is "<<p3[0]<<",p3[1] is "<<p3[1]<<".\n";
p3=p3-1;
delete []p3;
return 0;
}
使用new创建动态结构
创建结构:
structName * pointer_name = new structName;
例如inflatable * ps = new inflatable;
访问成员:
因为动态创建的结构没有名称,所以不能使用成员运算符句点.
。
一种访问结构成员的方法是使用而箭头成员运算符->
。(ps->price
)
另一种访问结构成员的方法是(*ps).price
。
一个使用new和delete的示例
定义一个函数getname()
,该函数返回一个指向输入字符串的指针。该函数将输入读入到一个大型的临时数组中,然后使用new[]
创建一个刚好能够存储该输入字符串的内存块,并返回一个指向该内存块的指针。
//delete.cpp
#include <iostream>
#include <string.h>//or csting
using namespace std;
char* getname(void);//function prototype
int main()
{
char *name;//create pointer but no storage
name=getname();//assign adress of string to name
cout<<name<<" at "<<(int*)name<<"\n";
delete []name;//memory freed
name=getname();//reuse freed memory
cout<<name<<" at "<<(int*)name<<"\n";
delete []name;
return 0;
}
char* getname()
{
char temp[100];//temporary storage
cout<<"Enter name:";
cin>>temp;
char* pn=new char[strlen(temp)+1];
strcpy(pn,temp);//copy string into smaller space
return pn;
}
注意该程序中将new和delete分开放在不同的函数中,此行为不推荐。