我有用例场景。
List* pList = new List();
for (...)
{
Integer* pInt = new Integer();
ASSERT_TRUE(pInt != NULL);
pList->Add(*pInt);
}
现在,如果pInt
在任何迭代中都为空,那么此测试用例将停止,pList
将不会被释放。
在pList
执行时,有没有办法释放ASSERT_TRUE
?
谢谢
答案 0 :(得分:2)
现在,如果
pInt
在任何迭代中都为空,那么此测试用例将停止,pList
将不会被释放。
假设你没有覆盖new
运算符(如果你这样做,你可能不会问这个问题),并且假设编译器没有错误,pInt
永远不会为空。失败时,new
抛出std::bad_alloc
异常,它不会返回null。
此外,无论如何,断言都是应该始终保持的东西(如果是这样)。断言失败是一个错误。在断言失败后添加代码来清理是没有意义的:只需修复bug。
现在正在释放...提供的示例代码只能forget new
and use automatic objects:
List pList;
for (...)
{
Integer pInt = Integer();
pList.Add(pInt);
}
答案 1 :(得分:1)
如果你可以使用lambdas,你可以这样做:
ASSERT_TRUE(pInt != nullptr)
<< [pList]()->std::string { delete pList; return "Your error message."; }();
只有断言失败才会执行lambda。
然而,最好的选择可能是使用std::unique_ptr
或类似的智能指针而不是原始指针,并完全避免担心。