2016-04-08 7 views
3

Ich versuche derzeit, die detect_memory_leaks Option mit Boost auf meinem Mac (OS: El Capitan 10.11.3) zu verwenden. Bis jetzt, jedes Mal, wenn ich meine Testbinär mit der Option --detect_memory_leaks=1 ausgeführt habe, egal wie viel ich lecke, beschwört sich Boost nicht. Wenn Sie mein Problem reproduzieren möchten, hier ist eine Möglichkeit zu reproduzieren:Verwenden Boost Test detect_memory_leaks Option auf MacOS

Ich verwende Boost 1.59 Version und kompiliere das Unit-Test-Framework als statische Bibliotheken. Dann erstelle ich zwei Beispielprogramme:

main.cpp:

#define BOOST_TEST_MODULE test module name 
#include <boost/test/unit_test.hpp> 

test.cpp:

#include <boost/test/unit_test.hpp> 

BOOST_AUTO_TEST_SUITE(TestSuiteSample) 

BOOST_AUTO_TEST_CASE(TestCaseSample) 
{ 
    int * a = new int[3]; // This will leak memory, boost should complain 
    BOOST_CHECK(true); 
} 

BOOST_AUTO_TEST_SUITE_END() 

ich kompilieren meine binäre die folgende Art und Weise:

g++ -I../boost_1_59_0 -L../boost_1_59_0/stage/lib -lboost_unit_test_framework -lboost_chrono -lboost_prg_exec_monitor -lboost_system -lboost_test_exec_monitor -lboost_timer -lboost_unit_test_framework main.cpp test.cpp 

Wie Sie können sehen, ich habe alle Boost-Bibliotheken enthalten, die beim Kompilieren von Boost/Test erzeugt wurden, aber unter Verwendung von -lboost_unit_test_framework only com Haufen auch gut.

Jetzt habe ich eine ausführbare a.out, dass ich auf diese Weise starten:

./a.out --detect_memory_leaks=1 --log_level=all --report_level=detailed 

und ich bekomme folgendes Ergebnis:

Running 1 test case... 
Entering test module "test module name" 
test.cpp:3: Entering test suite "TestSuiteSample" 
test.cpp:5: Entering test case "TestCaseSample" 
test.cpp:8: info: check true has passed 
test.cpp:5: Leaving test case "TestCaseSample"; testing time: 60us 
test.cpp:3: Leaving test suite "TestSuiteSample"; testing time: 82us 
Leaving test module "test module name"; testing time: 105us 

Test module "test module name" has passed with: 
    1 test case out of 1 passed 
    1 assertion out of 1 passed 

    Test suite "TestSuiteSample" has passed with: 
    1 test case out of 1 passed 
    1 assertion out of 1 passed 

    Test case "TestSuiteSample/TestCaseSample" has passed with: 
     1 assertion out of 1 passed 

Wie Sie sehen können, gibt es keine Beschwerde von Schub über die new int[3] Ich habe nicht gelöscht. Zuerst dachte ich, es war der Compiler, der den Code optimiert und nicht einmal meine Variable zuweisen, aber valgrind sieht ein Leck als definitely lost:

==2571== by 0x10004E5BD: TestSuiteSample::TestCaseSample::test_method() (test.cpp:7) 

Ich verstehe nicht, was ich falsch mache, aber wenn Jeder weiß, wie man den Fehler erzeugt, der durch das Leck in test.cpp erzeugt wird, ich würde mich freuen, es zu wissen. Ich habe verschiedene Möglichkeiten ausprobiert, um die Option aufzurufen und habe versucht, herauszufinden, was ich in der Boost-Dokumentation tun soll, aber bisher scheint nichts zu funktionieren.

Hilfe ist willkommen :)

Antwort

3

Nach der Dokumentation [1][2] (Hervorhebung von mir): nur

Auf Plattformen, wo Erkennung von Speicherlecks innerhalb der laufenden Anwendung möglich ist (im Moment ist dies Windows-Familie) Sie können diese Funktion über diese Schnittstelle ein- und ausschalten.

Da Sie auf einem Mac sind und mit g ++ bauen, wird es nichts tun.

+0

Tatsächlich lese ich das Dokument zu schnell. Danke Jungs – guite