1. new和malloc()
1.1 malloc()函数
原型为--void *malloc(unsigned int num_bytes);
分配num_bytes字节的内存并返回所分配内存的指针,如果失败返回空指针(NULL);
void* 类型可以强制转换为任何其它类型的指针;
通过free()函数释放malloc()要求分配的内存,释放成功后应该将该指针指向NULL;
1.2 new运算符
new不仅申请要求分配内存,还会为被分配的内存调用构造函数;
对应地,delete在释放内存之前也会为内存调用析构函数;
new分配内存失败时,返回std::bad_alloc异常;
1.3 new与malloc()的区别
new自动计算分配的内存空间,malloc需要自己设置;
new返回的是对象(执行了构造函数),malloc返回的是内存地址;
new是类型安全的,malloc无法实现此功能;
new是运算符,maaloc是C的库函数;
2. 内存泄露
2.1 内存泄露分为两种--堆(heap)内存泄露和系统内存泄露(socket未被释放);
2.2 _CrtDumpMemoryLeaks()函数可以在输出窗口显示内存泄露的信息,如:
int* i = new int(0);// not be delete
_CrtDumpMemoryLeaks();
return;
将会输出如下内容:
Detected memory leaks!
Dumping objects ->
{234} normal block at 0x003007A8, 4 bytes long.
Data: < > 00 00 00 00
Object dump complete.
CRT堆调试技术不仅仅用来检测内存泄露,还可以检测缓冲区是否溢出;
CRT的原理就是匹配内存分配和内存释放操作,每次分配内存则将指针保存在list中,释放时再从list中删除;