前面简单介绍了Aspect C++,相信没人看出它有什么特别强大的地方。
这次特别挑了一个合适的例子,检查内存泄漏。
首先看一个普通的程序:
1、test.h
#ifndef __TEST_H__
#define __TEST_H__
class Test1
{
};
class Test2
{
};
class Test3
{
};
#endif // __TEST_H__
2、main.cc
#include "test.h"
int main ()
{
Test1 test1;
Test2 test2;
Test3 test3;
new Test1();
new Test2();
new Test2();
new Test1();
new Test1(test1);
new Test3(test3);
return 0;
}
这个程序会有6个对象泄漏。如果是在很隐蔽的地方分配对象,如何能够快速查找出来呢?
采用Aspect C++,我们可以在构造函数和析构函数中插入代码,帮助检查内存泄漏。
首先实现一个内存分配记录管理器:
1、memory_recorder.h
#ifndef __MEMORY_RECORDER_H__
#define __MEMORY_RECORDER_H__
#include <map>
#include <typeinfo>
using namespace std;
class MemoryRecorder
{
map<void*, const type_info*> objects;
public:
~MemoryRecorder ();
void addObject(void* obj, const type_info& ti);
void removeObject(void* obj, const type_info& ti);
};
extern MemoryRecorder g_memoryRecorder;
#endif // __MEMORY_RECORDER_H__
2、memory_recorder.cc
#include "memory_recorder.h"
#include <iostream>
using namespace std;
MemoryRecorder g_memoryRecorder;
MemoryRecorder::~MemoryRecorder ()
{
if (objects.size() > 0)
{
cout << objects.size() << " objects not released:" << endl;
for (map<void*, const type_info*>::const_iterator iter = objects.begin();
iter != objects.end();
iter ++)
{
cout << "\t" << iter->second->name() << ": " << (iter->first) << endl;
delete (iter->first);
}
}
}
void MemoryRecorder::addObject(void* obj, const type_info& ti)
{
objects.insert(make_pair(obj, &ti));
}
void MemoryRecorder::removeObject(void* obj, const type_info& ti)
{
objects.erase(obj);
}
3、实现方面,test.ah
#ifndef __TEST_AH__
#define __TEST_AH__
#include "memory_recorder.h"
#include <iostream>
using namespace std;
aspect MemberRecorder
{
pointcut all_class() = classes("Test%");
advice construction (all_class()) : after ()
{
g_memoryRecorder.addObject (tjp->target(), typeid(*tjp->target()));
}
advice destruction (all_class()) : after ()
{
g_memoryRecorder.removeObject (tjp->target(), typeid(*tjp->target()));
}
};
#endif // __TEST_AH__
这个方面实现的功能很简单,首先定义了一个pointcut(切面),它匹配所有以“Test”开头的类。
接下来定义了2个处理方法,分别在这些类的构造函数和析构函数调用之后执行。
tjp->target()指向Test*对象实例,其它的不详细说明了,应该都比较容易懂。
顺便说一下,前一篇里说源文件可以保存为.cpp文件,实际上是错误的,它只处理.h和.cc文件。
运行ac++产生代码,编译运行后效果如下:
F:\projects\aspectc-out>main
6 objects not released:
class Test1: 00372B40
class Test1: 00372B70
class Test3: 00372BA0
class Test1: 00374F90
class Test2: 00374FC0
class Test2: 00374FF0
另外,产生代码时最好是使用mingw,配置方便一些,不影响产生后的代码,产生后的代码可以使用VC编译。
相关推荐
标题 "aop:aspect" 指涉的是Spring框架中的面向切面编程(Aspect-Oriented Programming, AOP)的一个核心概念。在Spring AOP中,`aop:aspect`是XML配置中定义一个切面的元素,它允许我们将关注点(如日志、事务管理...
面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将横切关注点(crosscutting concerns)从业务逻辑代码中分离出来,以提高模块化。C++中的AOP理论探讨了如何在C++平台上实现面向切面编程,...
AOP 和 Aspect 注解切入 测试 Demo 1.ProxyFactory 基于 MethodBeforeAdvice、AfterReturningAdvice 利用 Spring Api 定义前、后置处理方法,并通过代理工厂类获取代理对象(代码或Xml配置实现) 2.ProxyFactoryBean...
知识点:面向切面编程(Aspect-Oriented Programming, AOP)与C++及Aspect C++ 在IT领域,尤其是软件工程和编程语言设计方面,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种重要的编程范式,旨在...
在Java开发中,AOP(面向切面编程)是一种强大的编程范式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志记录、事务管理、性能监控等。AOP通过“切面”这一概念,使得这些关注点可以模块化并独立于主要的...
整理的Spring AOP Aspect切入点语法,老师整理的,2018.08.01最新版
【标题】"aop实战.rar" 是一个关于面向切面编程(Aspect Oriented Programming, AOP)实践的压缩包,包含了一系列与AOP相关的文档和资料。AOP是一种编程范式,它允许开发者将关注点从核心业务逻辑中分离出来,如日志...
1、@Aspect放在类头上,把这个类作为一个切面。 2、 @Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。 3、5种通知。 3.1、@Before,前置通知,放在方法头上。 3.2、@After,后置【finally】...
### 在C++中运用AOP #### 一、引言 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在提高软件模块化程度,特别是通过将那些横切关注点(Cross-cutting Concerns)从应用程序的主要逻辑...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细...
1. **Spring AOP**:AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者定义“切面”,这些切面可以包含业务逻辑的各个部分,如日志、事务管理等。Spring AOP提供了一种...
也欢迎对AOP实战用法感兴趣的同学们加入。 使用场景及目标: 在生产环境中,通过巧妙的AOP机制,实现对日志的细致记录和处理。我们的目标是提高日志记录的效率和规范性,为监控和故障排查提供更为轻松便捷的工具。 ...
Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心组件之一,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP允许开发者定义“切面”,这些切面可以封装跨越多个对象...
在XML配置中,我们创建一个`<aop:config>`元素,并定义`<aop:aspect>`子元素来声明切面: ```xml <aop:config> <aop:aspect id="loggingAspect" ref="loggingAspectBean"> <!-- ... --> </aop:aspect> </aop:...
在本主题中,“基于AOP技术的应用层C++进程恢复”探讨了如何利用AOP在C++应用程序中实现检查点和恢复功能,以确保进程的稳定性和可靠性。 在C++中,传统的编程方式往往难以有效地处理非功能性需求,如日志记录、...
**AOP编程之AspectJ实战** 在软件开发中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在减少代码的重复性和提高模块化程度。AOP通过将关注点(如日志记录、事务管理、安全性检查等)...
### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...
例如,我们可以通过AOP技术来实现Activity生命周期的监控、性能监控、安全检查等。而Android自身虽未直接提供AOP支持,但我们可以通过第三方库,如AspectJ、Dagger等来实现AOP。 在实际应用中,比如要为Android中...
在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、事务处理等。在Spring框架中,AOP可以通过...