2009-10-29 70 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) 

我想这是因为没有去除的测试,加入到套件之前其实主要就是结束了。

这是我注册的测试方式:

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是过度设计的方式。换句话说,这是一堆垃圾。 – 2011-05-10 17:02:50

回答

2

CppUnit documentation建议runner.addTest接受任何测试的所有权。通过给runner.addTest仅提供myTest实例的一部分,您并未提供任何方式让整个myTest实例在删除时得到清理。手动运行delete在运行后运行myTest可能也不起作用,因为runner也会尝试删除已给出的部分myTest

如果您只想运行特定测试或测试子集感兴趣,则应该尝试使用TextRunner::run的参数testName

(如果你有时间和兴趣,你可能想寻找到一个不同的单元测试框架。UnitTest++Google Test是较新的,更容易使用,而且比CppUnit的更多的其他功能。)

+0

如果我没有为我想运行的测试注册套件,TextRunner :: run不起作用。 – 2009-10-30 08:51:35

+0

是的,但你的问题是你分配一整套(myTest),然后只注册一部分。 TextRunner清理那部分,但不知道清理整个套件。 – 2009-10-30 12:00:55

+0

即使我做了runner.addTest(myTest);那么我也有同样的行为,很多套房没有被毁灭。 – 2009-10-30 20:51:15