c动态内存管理
c语言里面的动态内存管理函数,介绍的有4个,分别是malloc,
realloc,calloc,和free,其函数原型分别如下
void *malloc(size_t size);
void *calloc(size_t num_elements,size_t element_size);
void realloc(void ptr,size_t new_size);
void free(void* pointer);
malloc函数是在堆空间上开辟一块合适的空间,并且返回一个指向这块内存的指针,这块开辟的空间没有进行任何方式的初始化,如果需要初始化,必须自己手动初始化。
calloc函数也是在堆空间上开辟一块合适的空间,并且返回一个指向这块内存的指针,但是,在返回指针之前,这块空间已经自动初始化为0了。不用自己在初始化,这是malloc 和calloc 最大的区别。
realloc函数是调整开辟的空间的大小,如果空间开辟小了,realloc函数会在开辟的一块空间,将新开辟的空间添加到原来空间的后面,新空间没有初始化,当然原来空间内容依然保留,如果空间不够开辟,realloc将分配另一块正确大小的空间,并把原来那块内存的内容复制到新的空间里,并且销毁原来那块空间,当然指针指向新的那块空间,如果空间开辟大了,空间尾部被拿掉,剩余部分的原先内容依然保留。
free函数是释放开辟的内存,接受的是指向内存的指针,
free的时候要注意,
> 同一块空间不能free两次,
>free不能只free空间的一部分
>不能不free
> free完,要将指针置空
> malloc和free要成对出现
cpp动态内存管理
cpp提供new和delete标识符(不是函数),来实现动态内存管理;
有两种形式
int *p1 = new int ;
delete p1;
int *p2 = new int[10];
delete[]p2;
在自定义类型中,例如类中,new办了两件事
> 1,开辟堆空间
> 2,调用构造函数
当然delete也办了两件事,
> 调用析构函数
> 回收堆空间
内置类型中,new delete和malloc 和free 是一样的
当然cpp中也提供了库函数operator new()和opreator delete()
来管理内存。
只不过这两者是new和delete的底层代码,使用new的时候会调用operator new,operator new会调用operator new[],operator[]会调用malloc,而delete会调用opreator delete[] ,operator[] 会调用free,最后还是回到了 malloc 和free上面,
因此,只要你理解了这层关系,你可以不用匹配写new和delete ,但是对于初学者来说,一定要匹配写,否则很容易弄错。