Этот вопрос является продолжением предыдущего вопроса на boost :: test :: unit_test.
Я написал модульный тест и создал его. Вот результат сборки:
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> Running 3 test cases...
2> Test suite "Master Test Suite" passed with:
2> 3 assertions out of 3 passed
2> 3 test cases out of 3 passed
2>
2> Detected memory leaks!
2> Dumping objects ->
2> {810} normal block at 0x007C5610, 8 bytes long.
2> Data: <P C > 50 E3 43 00 00 00 00 00
2> {809} normal block at 0x0043E350, 32 bytes long.
2> Data: < V| > 10 56 7C 00 00 00 CD CD CD CD CD CD CD CD CD CD
2> Object dump complete.
Я знаю из опыта, что вывод, который описывает утечку памяти, происходит от использования обнаружения утечки памяти CRT .
Обычно, чтобы определить, где находятся распределения в исходном коде, вы можете добавить следующее в начало вашей точки входа:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetBreakAlloc( 809 );
Однако boost :: test :: unit_test определяет свою собственную точку входа, не позволяя мне добавлять эти строки. Я пытался добавить эти строки в осветитель, но безуспешно. Я также попытался добавить эти строки в тестовый код, опять же безуспешно. Когда я пробую эти модификации, я получаю следующий вывод:
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: The command ""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" exited with code -2147483645.
Это число -ve преобразуется в 0x80000003 (один или несколько аргументов недопустимы).
Кто-нибудь может подсказать, как я могу определить, где в моем исходном коде / тестах могут быть эти две утечки памяти?
Для любопытных вот мой тест:
void DShowUtilsGetFilter()
{
// SysDevNames is a typedef for std::vector<wstring*>
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 <IBaseFilter> 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();
}
}