内存动态管理

内存动态管理:主要是指对“堆”内存或者自由内存的管理和使用

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

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

具体如下:
//C语法///
ANSI C标准邀请在使用动态分配函数是要包含#include命令将stdlib.h文件包含进来。
但是目前使用的一些C系统中,用的是malloc.h头文件。在使用中注意系统版本,当然有的系统不要求添加任何头文件。
        void*malloc(unsigned int size):开辟size大小的空间。
返回类型为void*是标准ANSI C建议的,也就是说返回指针不指向任何具体的类型,如果想将这个指针赋给执行类型的指针变量应当进行显式的转换(强制类型转换)。
应当指出,现在使用的许多C系统提供的malloc函数返回的类型为char*,如果想要将其赋给指定类型的指针变量仍要进行强制类型转换。
对于程序员来说,无论函数返回的指针类型是void还是char型,用法是一样的。
如果内存空间不够,则函数返回NULL.
        void* calloc(unsigned int num,unsigned int size):开辟num个大小为size字节的空间。

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

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

/C++语法//
new 数据类型
new 数据类型[元素个数]  //对数组

delete 指向分配空间的指针变量   //如分配的是单个对象空间
delete []指向分配空间的指针变量   //如分配的是数组对象空间
1、new和delete是运算符,不是函数。
2、如果 new 表达式无法获取需要的内存空间,系统将抛出名为 bad_alloc 的异常,可以通过new的重载函数调用异常也不抛出异常std::nothrow,另外还有placement new。
3、”delete指针”后,指针将变成悬垂指针,因此执行delete之后,最好立即将指针置为NULL.

警告:动态内存的管理容易出错
下面三种常见的程序错误都与动态内存分配相关:

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值