20170226C++项目班06-07_解决C++内存泄漏(补课)
来源:互联网 发布:江南大学网络教育好吗 编辑:程序博客网 时间:2024/04/28 08:38
内存泄漏检测:
1:C/C++语言速度快:因为有指针的存在。
空指针:nullptr,无法访问的。野指针 = 空悬指针:指向不再有使用权限的区域,不好调试错误
内存泄漏:指针指向空间没有释放导致的泄漏。非常不好找完全!保证完全无内存泄漏!
2:如果有任何一个地方存在内存泄漏,软件又是长久运行的,那么最终就可能导致内存使用完。当项目很大的时候,我们就很难发现所有地方的内存泄漏。
3:内存泄漏的检测:通过对new和delete的全局重载来实现,每次new的时候就将对应地方的信息保存起来,delete的时候就删除,这样就可以实现内存泄漏的检测。
在头文件DebugNew.h里面,添加:#define new new(__FILE__,__LINE__);
4:代码写完后,会出现很多bug,例如:
1:在重载的delete里面,调用的全局对象的NewTracer.remove方法在程序结束,NewTracer被delete的时候会出错。
2:在Add和Remove的时候后,可能会出现无穷递归的情况,需要使用锁来解决。
5:部分代码:
#ifndef TRACER_NEW_H_#define TRACER_NEW_H_#include <map>#ifdef _DEBUGvoid* operator new(size_t size, const char* file, long line);void* operator new(size_t size);void operator delete(void* p);class TracerNew{class TracerNewInfo//内部类!{public:TracerNewInfo(const char* file = nullptr, long line = 0);~TracerNewInfo();const char* File()const;long Line()const;private:const char* file_;long line_;};class Lock{public:Lock(TracerNew &tracer) :tracer_(tracer){tracer_.lock_count_++;}~Lock(){tracer_.lock_count_--;}private:TracerNew &tracer_;};public:TracerNew();~TracerNew();void Add(void* p, const char* file, long line);void Remove(void* p);void Dump();static bool Ready_;//防止最后全局变量NewTracer在被delete之后,还在Removemap里面的数据private:std::map<void*, TracerNewInfo> tracer_infos_;long lock_count_;};extern TracerNew NewTracer;#endif//!_DEBUG#endif//TRACER_NEW_H_
修改bug及添加新功能:
1:解决计算器项目的内存泄漏问题。
2:输入错误的时候应该抛出异常。
例如下列表达式:=,a=,=5,1+2)*4,……应该使用异常来处理。
3:添加函数功能,使之能使用log,sin,cos,tan……
例如:lg(5),e^5,abs(-2),sin(30)……
添加FunNode,Table等来实现函数的功能。
1:FunNode是一个一元节点,在FunTable里面来保存函数的字符串。
2:FunNode优先级是最高的,因该放在因子里面来做。
1 0
- 20170226C++项目班06-07_解决C++内存泄漏(补课)
- 【C++】内存泄漏问题
- c内存泄漏检查
- c/c++内存泄漏检测工具(上)
- 【C/C++】C/C++内存泄漏检测
- C代码检测内存泄漏
- C指针和内存泄漏
- c/c++内存泄漏检测
- Linux C 内存泄漏检测工具
- C/C++检测内存泄漏
- C语言内存泄漏检测
- C/C++内存泄漏检测
- Linux C 内存泄漏检测工具
- c/c++内存泄漏检测工具
- C/C++内存泄漏检测
- (转贴)(收藏)C语言补课笔记
- Objective-c 内存管理-内存泄漏
- c/c++内存泄漏检测工具(下) Code::Blocks
- layer弹出层的使用(一)
- Java中,为什么byte类型的取值范围为-128~127?
- 对于nodejs的异步的callback理解
- forward和redirect
- 排序算法优劣
- 20170226C++项目班06-07_解决C++内存泄漏(补课)
- 单例模式及其在iOS中的应用
- 常用类-BigInteger类、BigDecimal类、Date/DateFormat类、Calendar类
- 汇编代码的简单分析
- OllyDBG 资料汇总
- Linux网络配置详解
- 一位资深程序员大牛给予Java初学者的学习路线建议
- java jackson库各对象之间转换
- 在linux同一台主机下面搭建两个mysql 实例并实现主从复制 (一)