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

转载 2011年01月23日 11:05:00
前面简单介绍了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编译。
转自:http://www.cppblog.com/cpunion/archive/2005/12/16/1836.html
ACE
UNP
APUE
libevent

相关文章推荐

[C++之AOP]Aspect C++生成远程调用代码可能性探讨

C++ 0x keynote(以下简称0x)中描述了这样一个看起来不错的东西:1、本地调用代码: // use local object: X x; A a; std::string s(...

[Android进阶]Java、Android 内存泄漏总结

Java、Android 内存泄漏总结内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例...

c++ 内存泄漏检查

c++ 内存泄漏检查 转载自 http://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html 内存泄漏指由于疏忽或错误造成程序未能...

如何检查C++中的内存泄漏

如何检查C++中的内存泄漏

检查 C++ 内存泄漏(待整理)

内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个: 1.分配完内存后忘记回收 2.代码有问题,造成想回收却无法回收,例如: int* p=new int; p=new int;  ...

如何检查C++中的内存泄漏

内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:1.分配完内存后忘记回收2.代码有问题,造成想回收却无法回收,例如:int* p=newint;p=newint; //p指针修改,原来申...

C++内存泄漏检查方法总结

在VS2008中查看内存泄漏! 加入头文件#include  在程序的最后加入    _CrtDumpMemoryLeaks(); 在使用DEBUG时,程序退出后就会自动报告是否有内存泄漏! ...

如何检查C++中的内存泄漏 (原文地址:http://www.cppblog.com/Lyt/archive/2009/03/22/77517.html)

内存泄漏是编程中常常见到的一个问题,我所遇过的原因有两个:1.分配完内存后忘记回收2.代码有问题,造成想回收却无法回收,例如:int* p=new int;p=new int;   //p指针修改,原...

C++内存泄漏检查心得

温辉敏(wenhm@sina.com) 2009-7-1 晚 摘要:本文简单介绍了C++编程时,大家经常犯得一些内存泄漏方面的编码错误,并给出简单的代码示例。并简要给出了Win32平台下使用检测内存...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)