一、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释放空间。