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