快乐C编程动态内存分配

北京比较好白癜风医院 http://www.t52mall.com/

这一讲我们介绍动态内存分配的概念,在介绍之前呢,我们先来复习一下指针的概念。

一、指针

所谓的指针,我们这里约定:指针就是地址(有的书上把指针说成指针变量,容易引起读者的混淆,我们假设指针就是地址),变量的指针也就是变量的地址。我们可以用取地址运算符(放在一个变量的前面)获得一个变量的地址。比如:

a//获取变量a的地址

指针变量(它也是一个变量),不过它是存放指针(也就是说存放其他变量的地址)的变量。所以指针变量也没有什么特殊的,它就是一个变量而已,只不过里面存放的值不是整数int,不是char,存放的是指针或者说地址罢了。

指针变量的定义是p前面一个星号*,说明定义的这个变量p是一个指针变量,指针变量的类型是什么呢?是T。也就是说它存放的是T类型变量的地址。如:

T*p;//p是存储“T类型变量的地址”的变量。也就是说p里面只能存放T类型的变量的地址

假如p是一个指针变量,我们还可以通过取内容运算符*,来得到p所指向的变量的值。所以说,*p就是p中的地址所指向的那个内存块的变量。举例:

inta=3;

int*p=a;//int*,这里p是int型指针变量。

coutp‘\t’aendl;//这里p和a都表示a的地址

cout*p‘\t’aendl;//这里*p和a都表示a的内容(值)

但是如果左右边的类型不同,则会出错。比如

char*s=a;//错误。因为a是int类型的,它的地址只能存放在int类型的指针变量里面。这里需要把char换成int。

二、动态内存分配

什么叫动态内存分配?我们知道局部变量一般是存放在程序的堆栈里面的。每个程序都有一个堆栈区。计算机操作系统里,除了堆栈区,还有堆存储区。堆存储区就是所有程序共享的这块内存。也即所有程序共享的且空闲的内存。如果我们要想向操作系统里面的堆存储区的空闲内存申请一块内存,在C语言里,我们用malloc函数。但在C++中,建议使用new代替malloc。因为new除了分配内存,还会给对象做一定的初始化。特别是如果申请一个类对象的时候,可能需要调用类的构造函数。我们这里先new一个int类型的内存块,举例:

int*p=newint;//通过new一个int型内存块,就会向操作系统申请int大小的这样一块内存,如果成功了,把它的值赋值给int型的指针变量p,此时p的值是非0的,如果不成功p的值就是0(通常情况下都会成功,只要计算机内存足够多)

*p=3;//将刚才申请的那块内存中的值设置为3。因为上一句已经分配给它一个内存了(new的)。虽然它没有名字(这块内存是没名字的),我们没有通过名字去访问这块内存,但这块内存的地址存放在指针变量p里面,我们可以通过指针变量p去访问到这块内存。也就是说我们new申请了一块内存,虽然这块内存没有名字,但它的地址保存在我们程序定义的局部堆栈中的一个局部变量p里面,p这块内存是堆栈区的一块内存,就是我们程序函数的局部变量,而指向的地址是堆存储区的一块内存。

coutp‘\t’*pendl;//输出p的值(地址),还有*p(即内存块的内容)。

deletep;//动态分配的内存实际上是向操作系统申请的,我们如果使用完了,应该养成一个好的习惯,把它再释放掉。如果不释放掉,那么这块内存始终被你占用,易造成内存泄露。

上面的例子是用指针指向一块int型数据的内存,也可以指向多个int型的内存块,如数组。举例:

int*p=newint[5];//这个内存空间可以存放5个int型的数值,把它(这块内存)的地址放到p里面。这里的p实际上是指向5个int型数据中的第1个int数据的地址。

但是,此时释放内存是这样的:

delete[]p;//因为deletep只释放了一个,后面三个未释放,这里需要加上[]

以上就是动态内存分配的内容。

总结:new用于申请内存块,delete用于释放内存块

T*p=newT;

deletep;

T*q=newT[5];

delete[]q;

另外,在C++中,尽量用new和delete,而不要用C语言的malloc和free




转载请注明:http://www.aierlanlan.com/rzfs/6169.html