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;
}

[ PASSED ]、紅色 [ FAILED ]、黃色失敗細節,極具可讀性。Detected memory leaks!,精確標示配置位置(檔案、行號、配置序號、大小、資料內容)。
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.
定位步驟:
C:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\inet.cppCHttpConnection* pResult = new CHttpConnection(...);delete pConn;。
Detected memory leaks!
Dumping objects ->
{1080} normal block at 0x00C28148, 1 bytes long.
Data: < > CD
斷點定位法:
_CrtSetBreakAlloc(1080);xxx.exe has triggered a breakpoint)。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++ 專案品質把關的最佳實踐之一。