2009-10-29 2 views
3

работает мои регрессионные тесты с Valgrind у меня есть этот вид отчета:утечки CppUnit

 
==20341== 256 bytes in 1 blocks are indirectly lost in loss record 915 of 919                           
==20341== at 0x4A0661C: operator new(unsigned long) (vg_replace_malloc.c:220)                          
==20341== by 0x7F366FA: std::vector<CppUnit::Test*, std::allocator<CppUnit::Test*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<CppUnit::Test**, std::vector<CppUnit::Test*, std::allocator<CppUnit::Test*> > >, CppUnit::Test* const&) (new_allocator.h:88)                            
==20341== by 0x7F36496: CppUnit::TestSuite::addTest(CppUnit::Test*) (stl_vector.h:610)                        
==20341== by 0x585B80: TestVectorAlgebra::addTestsToSuite(CppUnit::TestSuiteBuilderContextBase&) (testvectoralgebra.h:30)               
==20341== by 0x586719: TestVectorAlgebra::suite() (testvectoralgebra.h:42)                           
==20341== by 0x5948C4: CppUnit::TestSuiteFactory<TestVectorAlgebra>::makeTest() (TestSuiteFactory.h:20)                    
==20341== by 0x7F2C6B0: CppUnit::TestFactoryRegistry::addTestToSuite(CppUnit::TestSuite*) (TestFactoryRegistry.cpp:149)                
==20341== by 0x7F2CAD5: CppUnit::TestFactoryRegistry::makeTest() (TestFactoryRegistry.cpp:136)                      
==20341== by 0x580760: main (testunit.cpp:88) 

Я предполагаю, что это из-за того, что Тесты добавлены в Suite, не удаляется перед главным закончен.

Это способ зарегистрировать тест:

CppUnit::TextTestRunner::TestRunner runner; 

    // Get the top level suite from the registry 
    CppUnit::Test* myTest = 
    CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest(); 

    runner.addTest(myTest->findTest("TestVectorAlgebra")); 

Как разрегистрировать эти тесты?

+0

Я диагностирована эта утечка а также с некоторыми профайлерами памяти Windows. Я считаю, что CppUnit является способным способом. Другими словами, это груз мусора. –

ответ

2

CppUnit documentation предполагает, что runner.addTest берет на себя все те испытания, которые он дал. Предоставляя runner.addTest только часть вашего экземпляра myTest, вы не предоставляете никакого способа, чтобы весь экземпляр myTest очистился при удалении. Вручную delete 'ing myTest после запуска, вероятно, тоже не будет работать, так как runner также попытается удалить часть myTest, чтобы она была предоставлена.

Если вы заинтересованы в выполнении определенного теста или подмножества тестов, попробуйте использовать параметр testNameTextRunner::run.

(А если у вас есть время и желание, вы можете посмотреть в другой блок испытательной базы. UnitTest++ и Google Test новее, проще в использовании, и больше возможностей, чем CppUnit.)

+0

TextRunner :: run не работает, если я не зарегистрирую пакет для теста, который я хочу запустить. –

+0

Да, но ваша проблема в том, что вы выделяете весь набор (myTest), а затем регистрируете его часть. TextRunner очищает эту часть, но не знает, чтобы очистить весь пакет. –

+0

Даже если я выполняю runner.addTest (myTest); то у меня такое же поведение, много люксов не уничтожено. –

Смежные вопросы