在断言失败时,析构函数中的CPPUNIT_ASSERT_MESSAGE崩溃

时间:2014-01-08 12:35:56

标签: c++ visual-studio-2008 compiler-errors cppunit

代码段的相关部分。上面的代码片段导致在退出期间在Win VC 8编译器中生成以下错误。在析构函数中传递断言可以修复崩溃。仅在Windows中观察到此错误,并且在linux中它可以正常工作。

class BasicMathTest: public TestFixture
{
    CPPUNIT_TEST_SUITE(BasicMathTest);
    CPPUNIT_TEST(testAdd);
    CPPUNIT_TEST(testMultiply);
    CPPUNIT_TEST(testDivide);
    CPPUNIT_TEST_SUITE_END();

    class A
    {
        public:
            ~A()
            {
                CPPUNIT_ASSERT_MESSAGE( "BasicMath::Addition", 0 );
            }

    };

    A ob;

    public:
    virtual void setUp( void );
    virtual void tearDown( void );

    void testAdd( void );
    void testMultiply( void );
    void testDivide( void );

    private:
    BasicMath *obj;
};

int main()
{
   TestRunner testrunner;

   Test *tests = TestFactoryRegistry::getRegistry().makeTest();
   testrunner.addTest( tests );
   testrunner.run( m_testResult );
   m_outputter->write();
   return !m_collector.wasSuccessful();
}

1 个答案:

答案 0 :(得分:0)

TestFixture的构造函数和析构函数不受异常保护。如果要在此阶段使用断言,则需要更改代码,以便可以将使用断言的代码(抛出异常)移动到setUp / tearDown中。

实际上,它甚至可能不会以未处理的异常终止而是崩溃,因为在展开堆栈时可能会遇到第二个异常。为了分离不同测试的状态,测试夹具被包装到仿函数中,每个测试都获得一个存储在向量中的新实例。再次提醒一下,在析构函数中抛出异常几乎总是一个坏主意。