【问题标题】:Memory leak in boost::regex libraryboost::regex 库中的内存泄漏
【发布时间】:2013-12-06 16:33:29
【问题描述】:

我对 Boost 库并不感兴趣。我需要它来匹配在 VS 2008 中编译的遗留 C++/MFC 项目中的正则表达式。

这是一个短代码sn-p:

//Need Unicode support
CString ss;
boost::tregex r(L"<(From )?([A-Za-z0-9_]+)>(.*?)");
boost::tmatch what;
CString chat_input(L"<Darker> Hello");
if(boost::regex_match(chat_input, what, r))     //Memory leak on this line
{
    // extract $1 as a CString:
    ss = L"Match";//CString(what[1].first, what.length(1));
}
else
{
    ss = L"No match";
}

当我在调试模式下运行它时,我会在输出窗口中看到以下内容:

Detected memory leaks!
Dumping objects ->
{287} normal block at 0x00460068, 4096 bytes long.
 Data: <                > 00 00 00 00 CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.

如果我注释掉 boost::regex_match 行,泄漏就会消失。

我在这里错过了什么?

PS。我链接到的 boost 版本是 1_55_0。

【问题讨论】:

  • 把上面的代码放在一个循环中,迭代 10 次(比如说),现在你的内存泄漏报告中有 10 个块吗?如果不是,那么我认为这不是内存泄漏。一些库会一次性分配他们永远不会释放的内存。
  • @john,那是什么?
  • 正如我所说,它可能是一次性的内存分配,永远不会被释放。这并不是真正的内存泄漏,因为内存总是会在程序退出时恢复。只是一个理论,像我说的那样检查一下。
  • @john:这是一种非常糟糕的内存管理方法。
  • @john:所以你的意思是我上面给出的代码在语义上是正确的,并且 boost 库本身中有一些东西可以筛选内存,对吗?

标签: c++ windows boost memory-leaks mfc


【解决方案1】:

找不到解决此问题的方法。仍然不能忽略它,因为在开发过程中忽略其他可能的内存泄漏太容易了。

对我有用的解决方案是创建一个独立的仅限 C/C++ 的 Dll 项目,并从中导出所有需要的 Boost 功能,而这些功能又可以从 MFC 项目中用作共享库。 (这使它成为 Boost 的简洁版本。)

如果其他人找到摆脱此内存泄漏警告的方法,请在此处发布。在此之前,这是我的答案...

【讨论】:

    【解决方案2】:

    单元测试框架CppUnit,也抱怨boost::regex 库中的“内存泄漏”。

    我认为这是因为boost::regex 实现使用了静态成员变量,例如“Meyers”单例,而内存泄漏检测不喜欢它。 boost 库没有任何问题,它肯定没有内存泄漏!

    从 MSVC 2010 起,您可以使用 std::regex 代替,我可以保证您不会报告任何泄漏。在 MSVC 2008 中您应该可以使用 std::tr1::regex,但我没有任何经验,很抱歉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多