`
qiezi
  • 浏览: 498582 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[C++之AOP]实战Aspect C++之检查内存泄漏

    博客分类:
  • c++
阅读更多
前面简单介绍了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

    标题 "aop:aspect" 指涉的是Spring框架中的面向切面编程(Aspect-Oriented Programming, AOP)的一个核心概念。在Spring AOP中,`aop:aspect`是XML配置中定义一个切面的元素,它允许我们将关注点(如日志、事务管理...

    C++ AOP编程理论

    面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将横切关注点(crosscutting concerns)从业务逻辑代码中分离出来,以提高模块化。C++中的AOP理论探讨了如何在C++平台上实现面向切面编程,...

    AOP 和 Aspect 注解切入 测试 Demo

    AOP 和 Aspect 注解切入 测试 Demo 1.ProxyFactory 基于 MethodBeforeAdvice、AfterReturningAdvice 利用 Spring Api 定义前、后置处理方法,并通过代理工厂类获取代理对象(代码或Xml配置实现) 2.ProxyFactoryBean...

    aspect c++

    知识点:面向切面编程(Aspect-Oriented Programming, AOP)与C++及Aspect C++ 在IT领域,尤其是软件工程和编程语言设计方面,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种重要的编程范式,旨在...

    aop,aspect相关jar包

    在Java开发中,AOP(面向切面编程)是一种强大的编程范式,它允许程序员将关注点从核心业务逻辑中分离出来,如日志记录、事务管理、性能监控等。AOP通过“切面”这一概念,使得这些关注点可以模块化并独立于主要的...

    整理的Spring AOP Aspect切入点语法

    整理的Spring AOP Aspect切入点语法,老师整理的,2018.08.01最新版

    aop实战.rar

    【标题】"aop实战.rar" 是一个关于面向切面编程(Aspect Oriented Programming, AOP)实践的压缩包,包含了一系列与AOP相关的文档和资料。AOP是一种编程范式,它允许开发者将关注点从核心业务逻辑中分离出来,如日志...

    Spring AOP @Aspect 基本用法

    1、@Aspect放在类头上,把这个类作为一个切面。 2、 @Pointcut放在方法头上,定义一个可被别的方法引用的切入点表达式。 3、5种通知。 3.1、@Before,前置通知,放在方法头上。 3.2、@After,后置【finally】...

    在C++中运用AOP

    ### 在C++中运用AOP #### 一、引言 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在提高软件模块化程度,特别是通过将那些横切关注点(Cross-cutting Concerns)从应用程序的主要逻辑...

    spring4 AOP 面向切面编程@Aspect

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理、权限检查等。`@Aspect`是Spring AOP的核心注解,用于定义一个切面。下面我们将详细...

    springboot+aspect实现springaop拦截指定方法.zip

    1. **Spring AOP**:AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它允许开发者定义“切面”,这些切面可以包含业务逻辑的各个部分,如日志、事务管理等。Spring AOP提供了一种...

    Spring AOP实战 记录日志 下载可以直接使用

    也欢迎对AOP实战用法感兴趣的同学们加入。 使用场景及目标: 在生产环境中,通过巧妙的AOP机制,实现对日志的细致记录和处理。我们的目标是提高日志记录的效率和规范性,为监控和故障排查提供更为轻松便捷的工具。 ...

    Spring AOP配置实例

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的核心组件之一,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。AOP允许开发者定义“切面”,这些切面可以封装跨越多个对象...

    spring aop注解方式、xml方式示例

    在XML配置中,我们创建一个`&lt;aop:config&gt;`元素,并定义`&lt;aop:aspect&gt;`子元素来声明切面: ```xml &lt;aop:config&gt; &lt;aop:aspect id="loggingAspect" ref="loggingAspectBean"&gt; &lt;!-- ... --&gt; &lt;/aop:aspect&gt; &lt;/aop:...

    基于AOP技术的应用层C++进程恢复

    在本主题中,“基于AOP技术的应用层C++进程恢复”探讨了如何利用AOP在C++应用程序中实现检查点和恢复功能,以确保进程的稳定性和可靠性。 在C++中,传统的编程方式往往难以有效地处理非功能性需求,如日志记录、...

    AOP编程之AspectJ实战

    **AOP编程之AspectJ实战** 在软件开发中,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在减少代码的重复性和提高模块化程度。AOP通过将关注点(如日志记录、事务管理、安全性检查等)...

    Spring之AOP介绍

    ### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...

    深入理解Android之AOP

    例如,我们可以通过AOP技术来实现Activity生命周期的监控、性能监控、安全检查等。而Android自身虽未直接提供AOP支持,但我们可以通过第三方库,如AspectJ、Dagger等来实现AOP。 在实际应用中,比如要为Android中...

    Spring中的AOP不生效

    在Java开发中,面向切面编程(Aspect Oriented Programming,简称AOP)是一种重要的编程思想和技术手段,主要用于处理横切关注点问题,如日志记录、性能统计、安全控制、事务处理等。在Spring框架中,AOP可以通过...

Global site tag (gtag.js) - Google Analytics