本文主要是介绍(P53)面向对象版表达式计算器:内存跟踪器的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.内存跟踪器的实现
1.内存跟踪器的实现
-
1个解决方案中可以包含多个工程
所以要编译和启动CalculatorTest项目,则需要将其设置为启动项目
接着运行,此时就是CalculatorTest项目
-
有几种方法可以跟踪内存使用状况呢?
(1)自己实现malloc(new内部也是使用malloc实现的),在里面进行跟踪
(2)推荐使用内存检测工具进行跟踪:
Linux:valgrind,dmalloc,efence
Windows:visual leak detector
(3)自己编写小型的内存跟踪器:重载operator new和operator delete来进行跟踪
new operator等价于operator new先分配内存 + 如果是一个类对象还会调用构造函数,所以可以在operator new中跟踪在哪一个文件哪一行分配了内存 -
头文件的包含次序,为了防止一些隐含的依赖:C库、C++库、其他库.h、项目中的.h
-
eg:编写测试程序测试内存泄漏时发生的情况
P53\CalculatorTest\main.cpp
#include <iostream>
using namespace std;
#include "DebugNew.h"int main(void)
{int* p =new int;// delete p;return 0;
}
-
测试:
-
eg:P53\CalculatorTest\main.cpp
#include <iostream>
using namespace std;
#include "DebugNew.h"int main(void)
{int* p =new int;delete p;return 0;
}
- 测试:
按下F11
此时调用的operator delete并不是void operator delete(void* p, const char*, long),所以这里需要重载void operator delete(void*p),否则可能存在误报的现象
- eg:P53\CalculatorTest\main.cpp
#include <iostream>
using namespace std;
#include "DebugNew.h"int main(void)
{int* p =new int;delete p;int* p2 = new int[5];//delete[] p2;return 0;
}
-
测试:
-
为啥要重载operator delete[]运算的原因?
因为发现通过打断点进入debug,发现调用的是这种的delete
这篇关于(P53)面向对象版表达式计算器:内存跟踪器的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!