2012年3月5日

C++下类似Perl正则表达式的支持库deelx.h存在严重的内存泄漏,用boost::regex取代deelx.h

经历一番折腾,我用deelx.h支持的正则表达式完成了我需要的全部功能,但测试程序的内存开销时,吓了一大跳。deelx.h存在严重的内存泄漏。经过内存泄漏工具的检测,原来是realloc函数的使用出现了问题。我花了一个小时也没能搞定deelx.h中的这个bug。万般无奈,换到了boost:regex库。结果经过简单的程序片段转换,我完成的新版程序功能和原先的完全一样,而且完全没有内存泄漏。

原先我还有一个Perl程序实现了同样的功能。对比Boost::regex的实现以及Perl的实现,Boost内存开销小一些,但Perl速度快很多,二者都没有内存泄漏。网上对deelx.h的好评很多,猜想他们都是在用match功能,一旦用上replace功能,deelx.h就会吃光内存了。其实deelx.h在CodeProject上也获得了很多好评,但同时也被人发现了内存泄漏问题,很奇怪的是这个问题09年10月就被人发现了,作者也知道这事儿,为什么就还没有被修正呢?有机会时我再试试。

2012年3月2日

C++下类似Perl正则表达式的支持库deelx.h中Bug的修正

今天要转换一段Perl中的正则表达式替换代码到C++中。以前积累下的deelx库可以方便的发挥作用了。
原始的deelx.h可以在这里找到 http://www.regexlab.com/zh/deelx/introidx.htm

但是在使用deelx的Replace功能时,总是遇到三处Bug,如下:
deelx.h:3626: error: cast from ‘const char*’ to ‘int’ loses precision
deelx.h:3637: error: cast from ‘const char*’ to ‘int’ loses precision
deelx.h:3644: error: cast from ‘const char*’ to ‘int’ loses precision

不管我怎么修正我的main.cpp总是会得到这样三个Bug,百思不得其解。最后在一个论坛上找到了解决方案 http://stackoverflow.com/questions/153065/converting-a-pointer-into-an-integer

原来是deelx.h在64位机器上编译时,原先的强制转换(int)都遇到了问题,需要修改为(size_t)来自适应64位的编译器。

三处bug都从(int)修改为(size_t)后就都解决掉了。现在的Replace功能就能正常使用了。

留在此处供遇到同样问题的朋友参考。