首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Google Test 彩色輸出 + Boost.Test 記憶體洩漏偵測:雙劍合璧的單元測試利器

     編輯:關於C++

Google Test(gtest)擁有極佳的彩色終端機輸出,Boost.Test 則內建強大的記憶體洩漏偵測與定位。兩者各有所長,若能結合使用將如虎添翼。本文示範如何在同一專案中整合兩者:gtest 跑功能測試,Boost.Test 專司記憶體檢查。

整合專案結構

#include <iostream>
#include <gtest/gtest.h>
#pragma comment(lib, "gtestd_d.lib")  // MSVC 連結除錯版

#include <boost/test/unit_test.hpp>

// gtest 測試案例
TEST(FooTest, BasicAssertions) {
    char* leak = new char[2];  // 故意洩漏
    EXPECT_EQ(3, 3);
    EXPECT_EQ(2, 3);           // 故意失敗
}

// Boost.Test 測試案例
void boost_test_func() {
    char* leak = new char[2];
    BOOST_CHECK(3 == 3);
    BOOST_CHECK(2 == 3);
}

// Boost.Test 入口點:先跑 gtest,再跑 Boost.Test
using boost::unit_test::test_suite;
test_suite* init_unit_test_suite(int argc, char* argv[]) {
    std::cout << "=== gtest running... ===\n";
    ::testing::InitGoogleTest(&argc, argv);
    ::testing::UnitTest::GetInstance()->Run();

    std::cout << "\n\n=== boost.test running... ===\n";
    test_suite* ts = BOOST_TEST_SUITE("Combined");
    ts->add(BOOST_TEST_CASE(&boost_test_func));
    return ts;
}

執行結果對比

gtest 彩色輸出與 Boost.Test 記憶體洩漏報告並列顯示

  • gtest:綠色 [ PASSED ]、紅色 [ FAILED ]、黃色失敗細節,極具可讀性。
  • Boost.Test:輸出 Detected memory leaks!,精確標示配置位置(檔案、行號、配置序號、大小、資料內容)。

Windows MFC 專案記憶體洩漏定位實戰

場景一:有檔案名與行號

Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(141) : {1081} normal block at 0x0038F448, 30 bytes long.
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\inet.cpp(509) : {1080} client block at 0x01268148, subtype c0, 28 bytes long.
  a CHttpConnection object at $01268148, 28 bytes long
Object dump complete.

定位步驟:

  1. 找到本機對應原始碼:C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\inet.cpp
  2. 定位第 509 行:CHttpConnection* pResult = new CHttpConnection(...);
  3. 搜尋呼叫端:發現呼叫者未釋放回傳指標 → 修補 delete pConn;。

場景二:無檔案名行號(僅配置序號)

Detected memory leaks!
Dumping objects ->
{1080} normal block at 0x00C28148, 1 bytes long.
Data: < > CD

斷點定位法:

  1. 程式啟動早期加入:_CrtSetBreakAlloc(1080);
  2. 啟動偵錯,程式將在該配置序號處中斷(xxx.exe has triggered a breakpoint)。
  3. 查看呼叫堆疊即可定位來源。

根治方案:啟用 DEBUG_NEW 宏

在專案預編譯標頭或通用標頭檔加入:

#ifdef _DEBUG
#define new DEBUG_NEW
// #define DEBUG_NEW new(THIS_FILE, __LINE__)  // 等效展開
#endif

重新編譯後,洩漏報告將自動包含檔案名與行號:

Detected memory leaks!
Dumping objects ->
d:\work\xxx\xxx.cpp(167) : {1080} normal block at 0x00C28148, 1 bytes long.
Data: < > CD

版本資訊與資源

結合 gtest 的可讀性與 Boost.Test/CRT 的洩漏定位能力,構建「功能驗證 + 資源安全」雙重保障的測試管線,是 C++ 專案品質把關的最佳實踐之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved