C++内存管理分析

本文详细分析了C++中内存管理的关键概念,包括malloc, calloc, realloc的区别以及内存泄漏的检测。讲解了new/delete操作符的工作原理,特别是new背后如何分配内存和调用构造函数,delete如何执行析构和释放内存。同时讨论了malloc/free与new/delete在处理对象内存管理上的差异,并强调了new/delete在处理数组时的特殊性。" 108066961,5670949,解决Charles HTTPS抓包乱码问题,"['测试技术', '网络抓包', 'SSL证书']
摘要由CSDN通过智能技术生成
malloc/calloc/realloc的区别?

1. malloc
函数原型:
void *malloc(size_t size);
函数功能:
malloc()在内存的动态存储区中分配一块长度为size字节的连续区域。参数size为需要的内存空间的长度,返回该区域的地址。
区别:
malloc不能初始化所分配的内存空间,需要用memset,而函数calloc能初始化。如果这部分内存曾经被分配过,则其中可能遗留各种各样的数据。
2. calloc
函数原型:
void *calloc(size_t nmemb, size_t size);
函数功能:
calloc()与malloc()相似,参数size为申请地址的单位元素长度,nmemb为参数个数。
区别:
calloc会将所分配的空间中的每一位都初始化为零。
3. realloc
函数原型:
void *realloc(void *ptr, size_t size);
函数功能:
realloc()是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址空间。
区别:
realloc可以对给定的指针所指向的空间进行扩大或缩小,原有的内存中的内容将保持不变。realloc并不保持调整后的内存空间和原来的内存空间保持同一内存地址,返回的指针很可能指向新的地址。

内存泄漏?如何检测内存泄漏?

C++中的内存泄露一般指堆中的内存泄露。堆内存是我们手动malloc/realloc/new申请的,程序不会自动回收,需要调用free或delete手动释放,否则就会造成内存泄露。

内存泄露的关键就是记录分配的内存和释放内存的操作,看看能不能匹配。跟踪每一块内存的生命周期。
例如:每当申请一块内存后,把指向它的指针加入到List中,当释放时,再把对应的指针从List中删除,到程序最后检查List就可以知道有没有内存泄露了。Window平台下的Visual Studio调试器和C运行时(CRT)就是用这个原理来检测内存泄露。
在VS中使用时,需加上

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
...
_CrtDumpMemoryLeaks();

crtdbg.h的作用是将malloc和free函数映射到它们的调试版本_malloc_dbg和_free_dbg,这两个函数将跟踪内存分配和释放(在Debug版本中有效)。

_CrtDumpMemoryLeaks函数将显示当前内存泄露,也就是说程序运行到此行代码时的内存泄露,所有未销毁的对象都会报出内存泄露,因此要让这个函数尽量放到最后。

举例如下:

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <iostream>
using namespace std;

int main(int argc,char** argv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值