分类: C/C++
2013-08-13 18:01:12
一、C之申请动态内存
头文件:alloc.h或malloc.h或stdlib.h
申请空间
malloc
void *malloc ( size_t size ); //必须被free一次性释放 ,若size超出可用空间,则返回空指针值NUL
辟空间
calloc
void *calloc ( size_t num_elements, size_t elements_size ) //calloc与malloc的区别就是在于calloc将开辟的内存块初始化为0,另外两者请求内存数量方式不同,calloc的参数是所需的元素个数和每个元素的字节数!
realloc
void *realloc ( void p, size_t new_size ); //修改一个原先已经分配的内存块大小。使用它使一块内存扩大还是缩小,若不能改变这块内存大小,将会开辟一块正确的内存,并将原来内存块上的内容,原样复制过去, 注意,新扩张的内存不进行初始化。
释放空间
free
void *free(void *p);
二、C++之申请动态内存管理
C/C++语言的内存管理经历了几次变革:
从malloc/free到new/delete,这场变革是OOP技术兴起的产物。C++是强类型语言,new/delete的主要成果也就是加强了类型观念,减少了强制类型转换的需求。但是从内存管理角度看,这个变革并没有多少的突破性。
从new/delete到内存配置器(allocator)。allocator的引入也是C++内存管理一个突破,allocator比较强大,本人目前不常用,所以就忽略了。
new运算符:为一个数据对象(结构或基本类型)获得并指定分配内存的通用格式如下:
typeName* pointer_name = new typeName; //前面类型名指定声明合适的指针,后面指定什么样的内存。地址本身只指出了对象存储地址的开始,而没有指出其类型(使用的字节数)。
相应的释放:delete pointer_name;
注: new分配的内存块通常与常规变量声明分配的内存块不同,常规变量在栈(stack)内存区域,而new从堆(heap)或自由存储区(free store)的内存区域分配。
new创建动态数组: typeName * pointer_name = new typeName [arr_num];
delete释放:
delete [] pointer_name; 带了方括号,则delete也要带方括号。
注:对空指针使用delete是安全的。