内存管理

本文介绍了内存分配的三种方式,对比了malloc、calloc、realloc的区别,阐述了free函数的作用及malloc和free的对应关系。还分析了malloc/free和new/delete的区别与联系,讲解了它们的调用原理。最后说明了内存泄漏的定义、预防方法和检测工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存分配的三种方式:

  • 从静态区存储区分配 内存,内存在程序编译期间已经分配好了,这块内存在程序整个运行期间都存在,例如全局变量,static变量
  • 在栈上创建,在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放;栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限;
  • 从对上分配,亦称动态内村分配,程序在运行的时候用malloc或new申请多少的内存,程序员自己负责在何时用free或delete释放内存。

malloc ,calloc ,realloc 三者的对比:

malloc函数原型: (void*)malloc(unsigned size);(字节数)
函数在内存中开辟一段连续的空间,size是所需的空间长度,开辟的字节大小为size*参数类型,开辟完之后返回这块空间的首地址

callocvoid* calloc(size_t numElements, size_t sizeOfElements);
和malloc相似,他也是开辟一块连续的空间 ,空间大小为:元素的个数*单个元素的字节数;

reallocvoid* realloc(void* ptr, unsigned newsize);(地址,字节数)
给一个已经分配地址的指针重新分配空间,参数ptr为原来的空间指针,newsize为重新申请的 地址长度;

三者的区别:
malloc申请一段空间,但是并没有初始化,调用memset初始化;
calloc申请一段空间,会初始化它;但是效率会降低;
realloc可以对给定的指针所指向的空间进行扩大或者缩小,如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块(20+size)*sizeof(int)的内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。

free函数做的事情:斩断指针变量与这块内存的关系。就像上面的例子一样malloc函数开辟的这一个数据块空间是属于p的,你只能通过p来访问这一块数据块空间,而free函数做的事情就是斩断malloc和p之间的联系。但是p指针本身存放的地址并没有发生变化,只是它对指针所指向的那块内存已经没有所有权了,不能对内存块进行操作。而那块内存块里面的数据也没有被改变,只是你没有办法去访问或者修改那块数据快中的内容了。

malloc和free是一一对应的,如果malloc两次但是只free一次就会存在内存泄漏,如果malloc一次free了两次,就会出错(第一次使用free的时候,malloc所开辟的空间就已经被释放,第二次使用free就无内存空间可以释放了,这种对内存的误操作就有可能会导致程序的崩溃)。

malloc/free和new/delete之间的区别和联系?
1. 它们都是动态管理内存的入口。
2. malloc/free是c/c++标准库的函数,new/delete是c++操作符
3. malloc/free只是动态分配/释放内存空间。而new/delete出来分配空间还会调用构造函数和析构函数进行初始化与清理。
4. malloc返回值void*需要转化,new不用
5. malloc申请失败会返回NULL;new会抛出异常
6.
new,delete,new[ ],delete[ ]调用原理
new:申请空间他会先调用void *operator new(sizeof(T))函数,函数里面调用maloc循环申请,直到申请成功,申请成功返回,失败,检测是否提供内存不足的应对措施, 提供:继续malloc; 不提供:抛出异常,代码无法正常运行,调用构造函数;

delete:1.调用析构函数清理对象;2.调用operator delete释放空间

new [N ]:1,调用 void *operator new[ ](sizeof_t count = N*sizeof(T),operator new(count)
调用N次构造函数分别初始化每个对象(有析构函数则在申请的空间前面多加4个字节,里面存储的是对象的个数)

delete【】:做的事:1.从空间的前四个字节中取出析构函数的调用次数N,调用N次析构函数析构N个对象2.调用operator delete释放空间

什么叫内存泄漏?怎么预防?怎么检测?
内存泄漏是用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序结束。
预防:在每次调用malloc/new之后,用完之后记得释放,并且置空,否则就会形成野指针
检测:检测工具Leaky-Linux下检测内存泄漏的程序。
LeakTracer-Linux、Solaris和HP-UX下跟踪和分析C++程序中的内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值