c/c++动态开辟空间的方式及比较 您所在的位置:网站首页 malloc和free哪个耗时更大 c/c++动态开辟空间的方式及比较

c/c++动态开辟空间的方式及比较

2023-09-08 18:35| 来源: 网络整理| 查看: 265

目录 C语言动态内存开辟的管理方式C++语言动态内存开辟的管理方式`malloc/free`和`new/delete`的异同点

C语言动态内存开辟的管理方式

:malloc/calloc/realloc malloc/calloc/realloc开辟空间的相同点:

都是C语言的库函数,在使用时都必须包含相应的头文件都是从堆上申请空间,使用完成时必须要通过free来进行释放,否则,内存泄漏申请空间成功后,返回空间的首地址,申请失败返回NULL,因此在使用时必须判空返回值类型为void*,在使用时要进行强制类型转化 void Test () { //malloc int* p1 = (int*) malloc(sizeof(int)); free(p1); //calloc int* p2 = (int*)calloc(4, sizeof (int)); // realloc int* p3 = (int*)realloc(p2, sizeof(int)*10); free(p3 ); }

malloc/calloc/realloc开辟空间的不同点: malloc:

#include/#include void *malloc( size_t size );

malloc只是开空间,参数是要申请空间的字节大小

#include #include #include void main( void ) { int *buffer; size_t size; buffer = (int *)malloc( 1000 * sizeof( int ) ) if( buffer == NULL ) printf( "Can't allocate memory\n" ); if( buffer != NULL ) printf( "Allocated 1000 int integers\n" ); free( buffer ); }

calloc:

#include /#include void *calloc( size_t num, size_t size );

1.开辟空间后空间会被初始化为0. 2.参数有两个,一个是申请元素的个数num,另一个表示单个元素类型的大小size

#include #include void main( void ) { long *buffer; buffer = (long *)calloc( 40, sizeof( long ) ); if( buffer != NULL ) printf( "Allocated 40 long integers\n" ); else printf( "Can't allocate memory\n" ); free( buffer ); }

realloc:

#include /#include void *realloc( void *memblock, size_t size );

realloc是进行空间大小调整的操作。(新的大小要大于原来的大小,否则会导致数据丢失) 功能:先判断当前的指针是否有足够的连续空间,如果有,扩大memblock指向的地址,并且将memblock返回,如果空间不够,先按照size指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来memblock所指内存区域(注:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

注: 1.如果memblock为NULL,则realloc()和malloc()类似。分配一个size的内存块,返回一个指向该内存块的指针。 2.如果size大小为0,那么释放memblock指向的内存,并返回NULL。 3.如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL。而原来的内存块保持不变。

int main () { int* p2 = (int*)calloc(4, sizeof (int)); //通过realloc来扩大p2的空间,并把新的地址赋值给p3 int* p3 = (int*)realloc(p2, sizeof(int)*10); free(p3 ); return 0; }

总结

realloc失败的时候,返回NULLrealloc失败的时候,原来的内存不改变,不会释放也不会移动假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址如果size为0,效果等同于free()。(对指针本身进行释放)传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的 6.传递给realloc的指针可以为空,等同于malloc。 C++语言动态内存开辟的管理方式

new和delete 注:C++兼容C语言,所以C语言内存管理方式在C++中可以继续使用,但是有了C++机制的关键字,优先使用C++的关键字。 申请内置类型空间:

void Test() { // 动态申请一个int类型的空间 int* ptr4 = new int; // 动态申请一个int类型的空间并初始化为10 int* ptr5 = new int(10); delete ptr4; delete ptr5; //管理对象组 // 动态申请3个int类型的空间 int* ptr6 = new int[3]; delete[] ptr6; } class Test { public: Test() : _data(0) { cout //申请一个Test类型空间 Test *p1=(Test*)malloc(sizeof(Test)); free(p1); //申请10个Test类型空间 Test *p2=(Test*)malloc(sizeof(Test)*10); free(p2); } void Test2() { //申请一个Test类型的空间并初始化为10 Test *p2=new Test(10); delete p2; //申请10个Test类型的空间 Test *p3=new Test[10]; delete[] p3; }

在申请自定义类型的空间时,new会自动调用构造函数,delete会自动调用析构函数

注:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和 delete[],搭配使用,避免出错。(对于内置类型来说,new[]开辟的空间用delete来释放程序不会崩溃,因为内置类型的空间开辟和释放不会调用构造函数和析构函数)

malloc/free和new/delete的异同点

malloc/free和new/delete的共同点是: 都是从堆上申请空间,并且需要用户手动释放。 malloc/free和new/delete不同的地方是:

malloc和free是函数,new和delete是操作符malloc申请的空间不会初始化,new可以初始化malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间 后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有