内存动态管理

来源:互联网 发布:元数据浏览器丢失 编辑:程序博客网 时间:2024/05/16 01:12


内存动态管理:只要是指对“堆”内存的管理和使用。

C语言中使用malloc()free()动态分配和释放存储单元。Malloc()以空间大小作为参数,不知道数据类型,因此分配空间后范围的地址指针无法指向具体的数据,必须进行强制转换后才可以指向具体数据。

C++提供了使用简便而功能更强的newdelete算符来分配和回收动态存储单元。

具体如下:

//////////////////////////////////////////////////////////C语法///////////////////////////////////////////////////////////////////////

ANSI C标准邀请在使用动态分配函数是要包含#include命令将stdlib.h文件包含进来。但是目前使用的一些C系统中,用的是malloc.h头文件。在使用中注意系统版本,当然有的系统不要求添加任何头文件。

 

void*mallocunsigned int size):开辟size大小的空间。

返回类型为void*是标准ANSI C建议的,也就是说返回指针不指向任何具体的类型,如果想将这个指针赋给执行类型的指针变量应当进行显式的转换(强制类型转换)。应当指出,现在使用的许多C系统提供的malloc函数返回的类型为char*,如果想要将其赋给指定类型的指针变量仍要进行强制类型转换。对于程序员来说,无论函数返回的指针类型是void还是char型,用法是一样的。

如果内存空间不够,则函数范围0.

void* callocunsigned int numunsigned int size):开辟num个大小为size字节的空间。

void freevoid *ptr):释放ptr所指向的已分配空间。

ptr所指的对象必须是动态开辟(是原来用malloc函数分配)的空间。不能free两次同一动态开辟的空间。

void* reallocvoid *voidunsigned int size

ptr指向的存储区(是原来用malloc函数分配的)的大小改为size个字节。可以是原先分配的空间扩大或缩小。注意,新的存储空间的地址与原存储空间的地址不一定相同。

/////////////////////////////////////////////////////////C++语法//////////////////////////////////////////////////////////////////////

new数据类型

new数据类型[元素个数] //对数组

delete指向分配空间的指针变量  //如分配的是单个对象空间

delete []指向分配空间的指针变量  //如分配的是数组对象空间

l  new和delete是算法,不是函数。
l  如果 new 表达式无法获取需要的内存空间,系统将抛出名为 bad_alloc 的异常。
l  “delete指针”后,指针将变成悬垂指针,因此执行delete之后,最好立即将指针置为0.




警告:动态内存的管理容易出错


下面三种常见的程序错误都与动态内存分配相关:


1.删除( delete)指向动态分配内存的指针失败,因而无法将该块内存返还给自由存储区。删除动态分配内存失败称为“内存泄漏(memory leak)”。内存泄漏很难发现,一般需等应用程序运行了一段时间后,耗尽了所有内存空间时,内存泄漏才会显露出来。


2.读写已删除的对象。如果删除指针所指向的对象之后,将指针置为 0值,则比较容易检测出这类错误。


3.对同一个内存空间使用两次 delete表达式。当两个指针指向同一个动态创建的对象,删除时就会发生错误。如果在其中一个指针上做 delete运算,将该对象的内存空间返还给自由存储区,然后接着 delete第二个指针,此时则自由存储区可能会被破坏。操纵动态分配的内存时,很容易发生上述错误,但这些错误却难以跟踪和修正。




0 0
原创粉丝点击