C与C++内存分配专题(malloc/calloc/realloc/_alloca/new)

1.函数原型
void* malloc(size_t size);
void* calloc(size_t nmemb, size_t size);
void* realloc(void* p,size_t newsize);
void* _cded_alloca(size_t);
2.区别
malloc: malloc()函数接收一个参数,为要分配的内存空间的大小。在内存的动态存储中分配一块长度为size字节的连续区域。分配空间时,不能进行同时的初始化,需要利用memset进行初始化,如果申请到的空间是已经用过的,则很有可能遗留下各种各样的数据,如果没有进行及时的额初始化,则程序运行的时候很有可能出现错误。
calloc: calloc()函数接收两个参数,为元素的个数和每个元素的大小。使用时不能在另外利用其它函数进行初始化,因为在分配空间的同时calloc函数会把空间中的每一位都初始化为0。
realloc: realloc()函数接收两个参数,为原有空间的地址和重新申请的地址空间。可以对给定的指针所指向的空间进行扩大或缩小,原有内存中的内容保持不变。
_alloca: _cded_alloca()函数接收一个参数,为要分配的内存空间的大小。_allocao是在栈上申请空间,用完之后马上就释放。
new: new为C++关键字,使用的时候不用依赖任何的头文件,与malloc作用类似,但是new返回指定类型的指针,并且可以自动计算所需要大小,而malloc则必须要由我们自己计算字节数,并且在返回后强行转换为实际类型的指针。且malloc和free不能激活构造函数和析构函数,也就是说不能为对象申请空间,而new和delete可以。
返回值:
调用成功后malloc和calloc都将返回所分配内容空间的首地址,realloc返回的指针可能指向新的地址。
开辟空间区别:
malloc/calloc/realloc均为在堆上开辟空间,使用完之后必须free释放,否则会造成内存泄漏的问题。_alloc为在栈上开辟空间,栈上空间具有作用域,在函数结束时会自动释放,由编译器自动维护。

**注:**new关键字为C++内容,笔者将会在继续更新。

发布了6 篇原创文章 · 获赞 6 · 访问量 2091

猜你喜欢

转载自blog.csdn.net/m0_46204326/article/details/104100639