Diese Frage ist eine Fortsetzung einer vorherigen Frage zu boost::test::unit_test.
Ich habe ein Unit-Test geschrieben und den Unit-Test erstellt. Hier ist die Build-Ausgabe:
2>------ Build started: Project: UnitTests, Configuration: Debug Win32 ------
2> stdafx.cpp
2> UnitTests.cpp
2> UnitTests.vcxproj -> F:\Src\Crash\trunk\Debug\UnitTests.exe
2>
2> 3 Testfälle werden ausgeführt...
2> Testgruppe "Master Testgruppe" bestanden mit:
2> 3 von 3 Behauptungen bestanden
2> 3 von 3 Testfällen bestanden
2>
2> Gefundene Speicherlecks!
2> Objekte im Speicher ->
2> {810} normaler Block bei 0x007C5610, 8 Bytes lang.
2> Daten:
Ich weiß aus Erfahrung, dass die Ausgabe, die das Speicherleck beschreibt, von der Verwendung der CRT-Speicherleckerkennung stammt.
Normalerweise könnten Sie zum Ermitteln der Zuordnungen im Quellcode folgendes am Anfang Ihres Einstiegspunkts hinzufügen:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc( 809 );
Da jedoch boost::test::unit_test seinen eigenen Einstiegspunkt definiert, kann ich diese Zeilen nicht hinzufügen. Ich habe versucht, diese Zeilen zu einer Fixture hinzuzufügen, jedoch ohne Erfolg. Ich habe auch versucht, diese Zeilen im Testcode hinzuzufügen, wieder ohne Erfolg. Wenn ich diese Änderungen versuche, erhalte ich folgende Ausgabe:
1>------ Build started: Project: UnitTests, Configuration: Debug Win32 ------
1> UnitTests.cpp
1> UnitTests.vcxproj -> F:\Src\Crash\trunk\Debug\UnitTests.exe
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: Der Befehl ""F:\Src\Crash\trunk\Debug\\UnitTests.exe" --result_code=no --report_level=short
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" wurde mit dem Code -2147483645 beendet.
Diese -ve Zahl entspricht 0x80000003 (ein oder mehrere Argumente sind ungültig).
Kann jemand vorschlagen, wie ich ermitteln könnte, wo in meinem Quellcode / Tests diese beiden Speicherlecks auftreten könnten?
Für die Neugierigen, hier ist mein Test:
void DShowUtilsGetFilter()
{
// SysDevNames ist ein typedef für std::vector
using namespace Crash::DirectShow;
using namespace Crash::SystemDevices;
using namespace std;
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc( 809 );
HRESULT hr = S_OK;
SysDevNames AudioDevices;
wstring wsAudioDevice;
CComPtr spAudioFilter;
try
{
TFAIL( ListDevicesInCategory( CLSID_AudioCompressorCategory, AudioDevices ) );
if( AudioDevices.size() == 0 )
throw E_FAIL;
wsAudioDevice.assign(*AudioDevices.at(0));
TFAIL( GetFilter( CLSID_AudioCompressorCategory, wsAudioDevice, &spAudioFilter ) );
if( spAudioFilter.p )
spAudioFilter.Release();
BOOST_CHECK_EQUAL (hr, S_OK);
}
catch(...)
{
BOOST_CHECK_EQUAL( 1, 0 );
}
if( AudioDevices.size() > 0)
{
for(SysDevNamesItr itr = AudioDevices.begin(); itr != AudioDevices.end(); itr ++ )
delete *itr;
AudioDevices.clear();
}
}