作者:平凡洗护店 | 来源:互联网 | 2023-09-23 09:30
什么是内存泄露:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而
- 什么是内存泄露:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
工具作用
- 在使用Debug版的malloc分配内存时,malloc会在内存块的头中记录分配该内存的文件名及行号。
- 当程序退出时会在main()函数返回之后做一些清理工作,这个时候来检查调试堆内存,如果仍然有内存没有被释放,则一定是存在内存泄漏。
- 从没有被释放的内存块,就可以获得文件名、行号,泄漏多少字节,会打印显示出来。
- 如下图所示,内存泄漏检测工具运行的效果。
Debug调试常用的宏
__FILE__ //所在的文件
__FUNCTION__ //函数功能
__FUNCDNAME__ //函数名
__LINE__ //在第几行
__DATE__ //产生的日期
__TIME__ //产生的时间
代码实现
MemoryCheck.h
#pragma once
#ifndef __MEMORY_CHECK_H__
#define __MEMORY_CHECK_H__
#ifdef _DEBUG
void* operator new(size_t size, const char* filename, const char* funame, int line);
void* operator new[](size_t size, const char* filename, const char* funame, int line);
void operator delete(void* pMem);
void operator delete[](void* pMem);
#ifndef __USE_MEM_CHECK__
#define __USE_MEM_CHECK__
#define new new(__FILE__,__FUNCTION__,__LINE__)
#endif // !__USE_MEM_CHECK__
#endif // _DEBUG
#endif // !__MEMORY_CHECK_H__
MemoryCheck.cpp
#include
main.cpp
#include
#include"MemoryCheck.h"
int main()
{
int* p = new int;
int* p2 = new int[5];
system("pause");
return 0;
}
注意
- 重载的new相冲突解决办法:
- 1.使用宏定义开关#define USE_MEM_CHECK,定义在MemoryCheckr.h的前面才能实现宏定义开关,注意顺序很重要,顺序错误也会导致不识别。
- 2.使用#undef new也可解决