【问题标题】:Switch off Memory Leak Detection in boost.Test在 boost.Test 中关闭内存泄漏检测
【发布时间】:2016-05-14 01:29:51
【问题描述】:

我目前正在使用 boost.Test,我想知道如果在调试模式下编译,是否可以关闭内存泄漏检测。

我不想使用命令行参数开关--detect_memory_leak=0。我正在寻找一种#define 参数,它可以在调试模式下关闭内存泄漏检测功能。

通过定义某个编译器开关来关闭内存检测功能也适合我。我目前正在使用 Microsoft Visual Studio 2010。

#define BOOST_TEST_DETECT_MEMORY_LEAK 0 // Preprocesser switch I'm looking for!
#define BOOST_TEST_MODULE MyUnitTest
#include <boost/test/included/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(MySuite);

    BOOST_AUTO_TEST_CASE(MyUnitTest) {
       /// Following code has a memory leak
       /// ....
    }

BOOST_AUTO_TEST_SUITE_END()

【问题讨论】:

  • 我很抱歉,但也许我没有把我的问题说清楚。后续#define BOOST_TEST_DETECT_MEMORY_LEAK 0
  • 我很抱歉,但也许我没有把我的问题说清楚。如果我在 DEBUG 或 RELEASE 模式下编译,这对我来说真的无关紧要。我只是想知道,如果 boost.Test 中有一个宏,它会切换内存泄漏的检测。上面提到的宏#define BOOST_TEST_DETECT_MEMORY_LEAK 0毕竟不起作用。

标签: c++ boost memory-leaks


【解决方案1】:

刚刚发现关闭内存泄漏检测的最佳方法可能是将以下代码 sn-p 包含到一个人的测试中。

#include <boost/test/debug.hpp>

struct GlobalFixture {
    GlobalFixture()   {  
        boost::debug::detect_memory_leaks(false);
    }
    ~GlobalFixture()  {  }
};

BOOST_GLOBAL_FIXTURE(GlobalFixture);

不过,对于单个测试,我还是无法关闭和打开内存泄漏检测。

【讨论】:

  • 调试命名空间在哪里?
【解决方案2】:

你可以直接将环境变量BOOST_TEST_DETECT_MEMORY_LEAK设置为0或者使用putenv:

#include <cstdlib>
//...
BOOST_AUTO_TEST_CASE(MyUnitTest) {
  putenv("BOOST_TEST_DETECT_MEMORY_LEAK=0");
  //...
}

编辑

当您使用 Visual Studio 2010 时,您可以尝试_putenv or _wputenv

#include <stdlib.h>
//...
BOOST_AUTO_TEST_CASE(MyUnitTest) {
  _putenv("BOOST_TEST_DETECT_MEMORY_LEAK=0");
  //...
}

否则,我在 Boost 文档中找到了一个函数 detect_memory_leaks,但它似乎仅在最近的 boost 版本中可用。

【讨论】:

  • 好主意!但是我应该把线放在哪里 putenv("BOOST_TEST_DETECT_MEMORY_LEAK=0"); ?在BOOST_AUTO_TEST_CASE 中添加它似乎对我不起作用?至于我,我只与BOOST_AUTO_TEST_SUITE 合作。所以没有main函数。
  • 嗨!非常感谢。使用函数detect_memory_leaks(false) 对我有用。而使用 _putenv 设置环境变量似乎没有任何效果。
  • 很高兴它帮助了你:)
【解决方案3】:
_CrtSetDbgFlag(0);

是唯一对我最有效的东西。泄露消息出来了,但还不足以让我等待。

这里有一些代码详细说明了我尝试过的所有内容:

struct GlobalFixture
{
    GlobalFixture()
    {
        // This doesn't seem to do anything
        // boost::debug::detect_memory_leaks(false);

        // This either
        //_putenv("BOOST_TEST_DETECT_MEMORY_LEAK=0");

        // This total hack also does nothing
        // using namespace boost::unit_test::runtime_config;
        // const_cast<boost::runtime::arguments_store&>(argument_store()).set(btrt_detect_mem_leaks, 0);

        // This gets rid of most of the messages
        _CrtSetDbgFlag(0);
    }
};

【讨论】:

    【解决方案4】:

    为什么不使用 _DEBUG 宏?

    #ifdef _DEBUG
    #define BOOST_TEST_DETECT_MEMORY_LEAK 0
    #endif
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      • 2011-07-13
      相关资源
      最近更新 更多