动态内存分配和撤销方式剖析
在C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了运算符new和delete来取代malloc和free函数。注意:new和delete是运算符,不是函数,因此执行效率高。虽然与C语言兼容,C++仍保留malloc和free函数,建议使用new和delete运算符,不要用malloc和free函数。
New运算符一般格式:new 类型 [初值]
用new分配数组空间时不能指定初值。如果由于内存不足等原因无法正常分配空间,则new会返回一个空指针NULL,可以根据该指针的值判断分配空间是否成功。
Delete运算符一般格式:
Delete[ ] 指针变量
例如:开辟空间存放一个结构体变量:
/*
*test3.cpp
*
* Created on: 2012-4-10
* Author: David
*/
#include<iostream>
#include<string>
usingnamespace std;
struct Student
{
stringname;
int num;
char sex;
};
int main()
{
Student*p; //定义指定结构体类型Student的数据的指针变量
p=new Student; //用new运算符开辟一个存放Student型数据的空间
p->name="David";//向结构体变量的成员赋值
p->num=12345;
p->sex="m";
cout<<p->name<<endl<<p->num<<endl<<p->sex<<endl;//输出各个参数
delete p; //撤销该空间
return 0;
}
在上面的代码中,我们并没有定义结构体变量,而是定义了一个基类型为Student的指针变量p,用new开辟一段空间用来存放Student类型的变量p。空间的大小由系统根据Student结构体大小自动算出,无需指定。执行new得到一个指向Student类型数据的指针值即起始地址,把这个起始地址赋给p。我们可以通过p来访问该空间,并对该空间内的成员赋值操作。用delete撤销该空间。
在动态分配/撤销空间时,通常将这两个运算符和结构体结合使用。要访问用new开辟的结构体空间,无法直接通过变量名进行,只能通过指针p进行访问。
如果要建立一个动态链表,必须从第一个结点开始,逐个开辟结点并输入各结点数据,通过指针建立起前后相链的关系。