3

我有用例场景。

List* pList = new List();    
for (...)
{

 Integer* pInt = new Integer();
 ASSERT_TRUE(pInt != NULL);
 pList->Add(*pInt);

}

现在,pInt在任何迭代中都应该为空,然后这个测试用例将停止并且pList不会被释放。

pList执行时有什么方法可以释放ASSERT_TRUE吗?

谢谢

4

2 回答 2

2

现在,pInt在任何迭代中都应该为空,然后这个测试用例将停止并且pList不会被释放。

假设您没有覆盖new运算符(如果您这样做了,您可能不会问这个问题),并且假设您的编译器没有错误,pInt则永远不会为空。失败时,new抛出std::bad_alloc异常,它不返回 null。

此外,断言适用于无论如何都应该始终成立的事物(就像这种情况一样)。断言失败是一个错误。在断言失败后添加代码进行清理是没有意义的:只需修复错误即可。

现在释放......提供的示例代码可以忘记new并使用自动对象

List pList;
for (...)
{

 Integer pInt = Integer();
 pList.Add(pInt);
}
于 2012-09-26T21:24:31.167 回答
2

如果你可以使用 lambdas,你可以这样做:

ASSERT_TRUE(pInt != nullptr)
    << [pList]()->std::string { delete pList; return "Your error message."; }();

仅当断言失败时才会执行 lambda。

但是,最好的选择可能是使用std::unique_ptr或类似的智能指针而不是原始指针,并完全避免担心。

于 2012-09-26T20:49:39.723 回答