动态内存管理

来源:互联网 发布:速拓软件手机 编辑:程序博客网 时间:2024/04/29 02:15

一、c语言内存申请相关的函数主要有alloca、calloc、malloc、realloc、free等。

(1)、malloc:void*malloc(size_t size);

malloc函数在使用时,只需要传递一个参数size,分配内存大小,一般需要用sizeof(type)*num手动计算。有事malloc所申请的空间可能

会比实际申请的空间要大。

(2)、calloc:void*calloc(size_t num,size_t size);

calloc与malloc都是在堆上申请一块连续的空间,不过calloc申请的空间已经初始化了,并且需要传递两个参数,所以calloc是在堆上申请

num个、大小为size的连续空间。

(3)relloc:void*relloc(void *memblock,size_t size);

memblock函数有两个参数,memblock是要修改空间的地址,size是重新申请的地址长度。

如果memblock补位NULL,则会对已分配好的内存进行修改,如果所要修改的内存过大,relloc会重新申请一块空间,并且将内容完全

复制过来,返回空间的首地址并将原有的地址进行销毁。

如果malloc为NULL则分配行为和malloc相同。

(4)malloc和calloc函数所开辟的内存空间都是在堆中开辟的,所以运行后要使用函数来释放内存。调用形式为free(p);//p为地址指针。

二、c++中提供的动态内存管理的底层实现及其接口operator ne/delete/new{}/delete{}

new operator/deleteoperator就是new和delete操作符,而operator new/operator delete是函数。

new operator

(1)调用operator new分配足够的空间,并调用相关对象的构造函数。

(2)不可以被重载

operator new

(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所需要求空间大小时,如果有new_handler,则调用new_handler,

否则如果没有要求不抛出异常,则执行bad_alloc异常,否则返回值为0

(2)可以被重载

(3)重载时,返回类型必须声明为void*

(4)重载时,第一个参数类型必须为表达要求分配空间的大小,类型为size_t.

(5)重载时可以带其他参数。

malloc/free 和new/delete的区别和联系

1.他们都是动态管理内存的入口

2.malloc/free时c/c++标准库的函数,new /delete时c++操作符。

3.malloc/free只是动态分配内存空间/释放空间。而new/delete除了分配空间还会调用构造函数和析构函数进行初始化和清理。

4.malloc/free需要手动计算类型大小且返回值为void*,new/delete可自己计算类型的大小,返回对应类型的指针。

new做了两件事 

调用operator new分配空间

调用构造函数初始化对象.

delete做了两件事

调用析构函数清理对象

调用operator delete释放空间

new[]

调用operator new 分配空间

调用n次构造函数分别初始化每个对象

delete[]

调用n次析构函数清理对象

调用operator delete释放空间。




原创粉丝点击