1,一个常用的宏,用于输出正在执行的语句.
#define TEACE(ARG) cout<<#ARG<<endl; ARG
2,一个跟踪new动态分配内存的程序
#include <cstdio>
#include <cstddef>
#include <cstdlib>
#include <cassert>
using namespace std;
bool traceFlag=true; //标识是否跟踪动态信息
namespace{
struct Info //保存跟踪信息
{
void* ptr; //地址
const char* file;//文件名
long line; //行号
};
const size_t MAXPTRS=10000u; //最多可以分配的地址数
Info memMap[MAXPTRS];
size_t nptrs=0; //已经分配的地址数
int findPtr(void* p) //返回地址的位置
{
for(size_t i=0;i<nptrs;i++)
if(memMap[i].ptr==p)
return i;
return -1;
}
void deletePtr(void* p) //回收这个地址
{
int pos=findPtr(p);
assert(pos>=0);
for(size_t i=pos;i<nptrs-1;i++)
memMap[i]=memMap[i+1];
nptrs--;
}
struct Report //利用全局对象的析构函数,输出最后的测试结果
{
~Report()
{
if(nptrs>0)
{
printf("Leaked memory at:\n");
for(size_t i=0;i<nptrs;i++)
printf("%p file:%s,line:%ld\n",memMap[i].ptr,memMap[i].file,memMap[i].line);
}
else
printf("No memory Leaks.\n");
}
};
Report r; //全局对象
} //这里没有分号
void* operator new(std::size_t sz, const char* file, long line)
{
void* p=malloc(sz);
if(nptrs==MAXPTRS)
{
printf("No enougth space!\n");
exit(1);
}
memMap[nptrs].ptr=p;
memMap[nptrs].file=file;
memMap[nptrs].line=line;
nptrs++;
if(traceFlag) //输出跟踪信息
printf("Allocated %u bytes at address %p,file: %s,line: %ld\n",sz,p,file,line);
return p;
}
void* operator new[](std::size_t sz, const char* file, long line)
{
return operator new(sz, file, line);
}
void operator delete(void* p)
{
if(findPtr(p)>=0)
{
free(p);
assert(nptrs>0);
deletePtr(p);
if(traceFlag) //输出跟踪信息
printf("Delete memoey at address %p\n",p);
}
else if(p)
printf("Attempt to delete unknown pointer:%p\n",p);
}
void operator delete[](void* p)
{
operator delete(p);
}
#define TRACE_ON() traceFlag=true;
#define TRACE_OFF() traceFlag=false;
int main()
{
//TRACE_OFF();
int* p=(int*)operator new(3,__FILE__,__LINE__);
operator delete(p);
int* p2;
operator delete(p2);
return 0;
}
分享到:
相关推荐
防御性编程是一种编程范式,旨在确保软件即使在遇到意料之外的使用情况时也能够继续正常工作。其核心思想在于减少或消除“墨菲定律”的影响,即任何可能出错的事物最终都将出错。防御性编程技术尤其在软件被恶意或...
防御性编程:顾名思义,防御性编程是一种细致的,谨慎的编程方法。为了开发可靠的软件产品,我们要谨慎地设计系统的每个细节,便是其能尽可能的“保护”自己,,我们通过明确的代码中增加很多的假设,当假设在现实的...
简单的帮助程序方法,使您无需担心防御性编程即可访问属性。 这个软件包已经在Node.js和浏览器(React风格的应用程序)的生产环境中使用了大约4年,没有出现问题。 safeGet 用箭头函数包装您的访问器,并将其传递...
《安全编程之道》是一本专注于C和C++编程语言的安全编程指南,旨在帮助开发者提升代码质量和安全性,防止软件漏洞导致的潜在威胁。本书基于“program secure”理念,深入探讨了如何在开发过程中实施最佳安全实践。 ...
Java安全性编程是现代Java开发中不可或缺的一部分,尤其是在网络应用、移动设备和企业级系统中,保护用户数据和系统安全显得尤为重要。本指南旨在提供全面的Java安全编程实践和策略,帮助开发者构建更安全的Java应用...
一份C++的源代码!! 系统主动防御源代码
第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发
第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发...
Java安全性编程指南(PDG)是一本专注于帮助开发者在Java平台上编写安全代码的参考资料。Java语言以其跨平台性和安全性著称,但如果不正确地使用,它也可能成为恶意攻击的目标。本指南旨在提供一套最佳实践和策略,以...
一个重要的编程惯用法是防御性编程,即在设计和实现过程中考虑到程序可能遇到的异常情况,并采取措施加以预防。书中指出了这种编程方式的必要性,并给出了一些实现策略。 代码的可维护性和可读性也是书中强调的内容...
4. **流行性**:示例代码应反映现代编程实践,比如使用Unicode、错误处理机制、防御性编程以及跨平台兼容性等。 #### 1.2 术语 文中涉及的专业术语包括但不限于: - **C++**:一种广泛使用的面向对象编程语言。 - ...
### 儿童编程启蒙之Scratch编程详解 #### Scratch编程语言概述 Scratch是一款专门为儿童设计的图形化编程语言,由美国麻省理工学院媒体实验室研发。它以直观易懂的操作界面和丰富的功能模块而著称,适用于8至16岁...
操作系统防御性第一讲 在本讲中,我们将讨论操作系统防御性第一部分的知识点,主要围绕操作系统的防御机制和安全性。 1. 操作系统防御性概述 操作系统防御性是指操作系统在执行过程中,保护系统免受各种攻击和...
7. chapter3:第三章可能涉及到C++的内存管理和指针操作,这是C++的一个难点,同时也是黑客最喜欢利用的漏洞之一。学习者将了解如何正确使用指针,防止缓冲区溢出和其他内存相关攻击。 8. chapter5:第五章可能涉及...