C++ boost或Visual Studio 2010中的内存泄漏

C++ boost或Visual Studio 2010中的内存泄漏,c++,visual-studio-2010,visual-c++,boost,stl,C++,Visual Studio 2010,Visual C++,Boost,Stl,我一直在Boost或Visual Studio 2010中发现漏洞。像这样简单的程序: #include <boost\regex.hpp> int main() { _CrtMemState state; _CrtMemCheckpoint(&state); { boost::regex my_filter; my_filter.set_expression("filter"); } _CrtMe

我一直在Boost或Visual Studio 2010中发现漏洞。像这样简单的程序:

#include <boost\regex.hpp>

int main()
{
    _CrtMemState state;
    _CrtMemCheckpoint(&state);

    {
        boost::regex my_filter;
        my_filter.set_expression("filter");
    }

    _CrtMemDumpAllObjectsSince(&state);
    return 0;
}
#包括
int main()
{
_CrtMemState;
_CrtMemCheckpoint(&state);
{
boost::regex my_过滤器;
my_filter.set_表达式(“filter”);
}
_CrtMemDumpAllObjectsSince(&state);
返回0;
}
返回

Dumping objects ->
{174} normal block at 0x00195C28, 1024 bytes long.
 Data: <    8\          > 00 00 00 00 38 5C 19 00 00 00 00 00 00 CD CD CD 
{172} normal block at 0x00195B90, 16 bytes long.
 Data: <  <         pO  > B8 D3 3C 01 01 00 00 00 01 00 00 00 70 4F 19 00 
{171} normal block at 0x00195B48, 8 bytes long.
 Data: < P      > BC 50 19 00 00 00 00 00 
{170} normal block at 0x00195AF8, 16 bytes long.
 Data: <  <         XQ  > E8 D3 3C 01 01 00 00 00 01 00 00 00 58 51 19 00 
{169} normal block at 0x00195A98, 32 bytes long.
 Data: < R   R   R      > 80 52 19 00 80 52 19 00 80 52 19 00 09 0C 00 00 
{168} normal block at 0x00195A48, 20 bytes long.
 Data: < Q   Q   R   Y  > E8 51 19 00 E8 51 19 00 E0 52 19 00 F8 59 19 00 
{167} normal block at 0x001959F8, 16 bytes long.
 Data: < 2=          R  > 94 32 3D 01 02 00 00 00 01 00 00 00 E0 52 19 00 
{158} normal block at 0x00195968, 80 bytes long.
 Data: <hY  hY  hY      > 68 59 19 00 68 59 19 00 68 59 19 00 CD CD CD CD 
{157} normal block at 0x00195920, 8 bytes long.
 Data: < W      > 0C 57 19 00 00 00 00 00 
{156} normal block at 0x001958B0, 52 bytes long.
 Data: < X   X   X      > B0 58 19 00 B0 58 19 00 B0 58 19 00 CD CD CD CD 
{155} normal block at 0x00195868, 8 bytes long.
 Data: < V      > F8 56 19 00 00 00 00 00 
{154} normal block at 0x001957F8, 52 bytes long.
 Data: < W   W   W      > F8 57 19 00 F8 57 19 00 F8 57 19 00 CD CD CD CD 
{153} normal block at 0x001957B0, 8 bytes long.
 Data: < V      > E4 56 19 00 00 00 00 00 
{150} normal block at 0x00195768, 8 bytes long.
 Data: <`3>     > 60 33 3E 01 00 00 00 00 
{149} normal block at 0x001952E0, 1096 bytes long.
 Data: <                > 09 0C 00 00 00 00 00 00 00 00 00 00 00 00 1A 00 
{148} normal block at 0x00195280, 32 bytes long.
 Data: < Z   Z   Z      > 98 5A 19 00 98 5A 19 00 98 5A 19 00 CD CD CD CD 
{147} normal block at 0x00195238, 8 bytes long.
 Data: < 3>     > 14 33 3E 01 00 00 00 00 
{146} normal block at 0x001951E8, 20 bytes long.
 Data: <HZ  HZ          > 48 5A 19 00 48 5A 19 00 CD CD CD CD CD CD CD CD 
{145} normal block at 0x001951A0, 8 bytes long.
 Data: < 3>  Z  > 04 33 3E 01 A8 5A 19 00 
{144} normal block at 0x00195158, 8 bytes long.
 Data: < R   Y  > E0 52 19 00 F8 59 19 00 
{143} normal block at 0x00195110, 8 bytes long.
 Data: <pO      > 70 4F 19 00 00 00 00 00 
{142} normal block at 0x00194F70, 356 bytes long.
 Data: < Q              > 10 51 19 00 00 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.
转储对象->
0x00195C28处的{174}正常块,1024字节长。
数据:<8\>00 00 38 5C 19 00 00 CD
0x00195B90处的{172}正常块,16字节长。
数据:<B8 D3 3C 01 01 00 00 00 00 00 70 4F 19 00
0x00195B48处的{171}正常块,8字节长。
数据:

BC 50 19 00 0x00195AF8处的{170}正常块,16字节长。 数据:<E8 D3 3C 01 00 01 00 00 58 51 19 00 0x00195A98处的{169}正常块,32字节长。 数据:80 52 19 00 80 52 19 00 80 52 19 00 52 19 00 09 0C 00 00 0x00195A48处的{168}正常块,20字节长。 数据:E8 51 19 00 E8 51 19 00 E0 52 19 00 F8 59 19 00 0x001959F8处的{167}正常块,16字节长。 数据:<2=R>94 32 3D 01 02 00 00 00 E0 52 19 00 0x00195968处的{158}正常块,80字节长。 数据:68 59 19 00 68 59 19 00 68 59 19 00 CD 0x00195920处的{157}正常块,8字节长。 数据:0C571900 0x001958B0处的{156}正常块,52字节长。 数据:B0 58 19 00 B0 58 19 00 B0 58 19 00 CD 0x00195868处的{155}正常块,8字节长。 数据:F8 56 19 00 0x001957F8处的{154}正常块,52字节长。 数据:F8 57 19 00 F8 57 19 00 F8 57 19 00 CD 0x001957B0处的{153}正常块,8字节长。 数据:E4 56 19 00 0x00195768处的{150}正常块,8字节长。 数据:>60 33 3E 01 00 0x001952E0处的{149}正常块,1096字节长。 数据:<>09 0C 00 00 1A 00 0x00195280处的{148}正常块,32字节长。 数据:98 5A 19 00 98 5A 19 00 98 5A 19 00 98 5A 19 00 CD 0x00195238处的{147}正常块,8字节长。 数据:<3>>14 33 3E 01 00 0x001951E8处的{146}正常块,20字节长。 数据:48 5A 19 00 48 5A 19 00 CD 0x001951A0处的{145}正常块,8字节长。 数据:<3>Z>04 33 3E 01 A8 5A 19 00 0x00195158处的{144}正常块,8字节长。 数据:E0 52 19 00 F8 59 19 00 0x00195110处的{143}正常块,8字节长。 资料:704F1900 0x00194F70处的{142}正常块,356字节长。 数据:10511900 对象转储完成。

我用boost1.47和1.50找到这个 我正在使用VisualStudio2010和SP1 它似乎是在VS2010。我试图找到一个修补程序,但没有成功


谢谢你给我小费

在这两个示例中,
\u CrtMemDumpAllObjectsSince
是在boost对象的析构函数运行之前被调用的,因此没有任何东西有机会进行自我清理。仍然分配的内存几乎肯定不是泄漏

应修改代码以确保在检查仍分配的内存之前运行析构函数:

#include <boost\regex.hpp>

int main()
{
    _CrtMemState state;
    _CrtMemCheckpoint(&state);

    {
        boost::smatch what;
    }

    _CrtMemDumpAllObjectsSince(&state);
    return 0;
}
#包括
int main()
{
_CrtMemState;
_CrtMemCheckpoint(&state);
{
刺激:smatch什么;
}
_CrtMemDumpAllObjectsSince(&state);
返回0;
}
或者,最好使用
\u crtsetdbgfagflag
功能:


设置
\u CRTDBG\u LEAK\u CHECK\u DF
标志。在所有全局析构函数运行后,将在程序退出时执行泄漏检查。这使得列出的任何项实际上都更有可能是泄漏。

这对于smatch来说是正确的,但仍然存在一个问题:`include int main(){u CrtMemState;{u CrtMemCheckpoint(&state);{boost::regex my_filter;my_filter.set_表达式(“filter”)}\u crtmdumpallobjectssince(&state);return 0;}您是否尝试过使用
\u CRTDBG\u LEAK\u CHECK\u DF
?在
atexit
处理程序中可能分配了一些被销毁的内容。或者可能是个漏洞。很难说<代码>\u CRTDBG\u LEAK\u CHECK\u DF是检查此问题的更好方法。如何使用
\u CRTDBG\u LEAK\u CHECK\u DF
?像这样<代码>\u CRTSETDBG标志(\u CRTDBG\u泄漏\u检查\u DF)我尝试了这个,但没有发现泄漏:
int main(){u CRTDBG\u leak\u CHECK\u DF;double*p=new double;return 0;}
我尝试了
\u CRTDBG\u ALLOC\u MEM\u DF\u CRTDBG\u leak\u CHECK\u DF\u CRTDBG\u CHECK\u CHECK总是DF)而且它工作得很好,谢谢!增压器没有泄漏:)那么你找到解决方案了吗?@ahmd0:没有。。。我们只是暂时接受它,直到我们升级了这个库,并希望它不会在未来的版本中出现。目前我们正在使用boost 1.47。