C++ CPPFUnit_断言_断言失败时析构函数中的消息崩溃
代码片段的相关部分。上述代码段导致Win VC 8编译器在退出时生成以下错误。在析构函数中传递断言可以修复崩溃。此错误仅在windows中观察到,在linux中工作正常C++ CPPFUnit_断言_断言失败时析构函数中的消息崩溃,c++,visual-studio-2008,compiler-errors,cppunit,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(testDivi
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();
}
TestFixture的构造函数和析构函数不受异常保护。如果您想在此阶段使用断言,您需要更改代码,以便可以将使用断言的代码移动到setUp/tearDown中,从而抛出异常 实际上,它甚至可能不会以未处理的异常终止,而是崩溃,因为在解除堆栈时可能会出现第二个异常。为了分离不同测试的状态,测试夹具被包装到一个函子中,每个测试都会得到一个存储在向量中的新实例。这再一次说明,在析构函数中抛出异常几乎总是一个坏主意