如何在gtest中的ASSERT_TRUE之后释放内存

时间:2012-09-25 03:59:34

标签: c++ googletest

我有用例场景。

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

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

}

现在,如果pInt在任何迭代中都为空,那么此测试用例将停止,pList将不会被释放。

pList执行时,有没有办法释放ASSERT_TRUE

谢谢

2 个答案:

答案 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或类似的智能指针而不是原始指针,并完全避免担心。