我有用例场景。
List* pList = new List();
for (...)
{
Integer* pInt = new Integer();
ASSERT_TRUE(pInt != NULL);
pList->Add(*pInt);
}
现在,pInt
在任何迭代中都应该为空,然后这个测试用例将停止并且pList
不会被释放。
pList
执行时有什么方法可以释放ASSERT_TRUE
吗?
谢谢
我有用例场景。
List* pList = new List();
for (...)
{
Integer* pInt = new Integer();
ASSERT_TRUE(pInt != NULL);
pList->Add(*pInt);
}
现在,pInt
在任何迭代中都应该为空,然后这个测试用例将停止并且pList
不会被释放。
pList
执行时有什么方法可以释放ASSERT_TRUE
吗?
谢谢
现在,
pInt
在任何迭代中都应该为空,然后这个测试用例将停止并且pList
不会被释放。
假设您没有覆盖new
运算符(如果您这样做了,您可能不会问这个问题),并且假设您的编译器没有错误,pInt
则永远不会为空。失败时,new
抛出std::bad_alloc
异常,它不返回 null。
此外,断言适用于无论如何都应该始终成立的事物(就像这种情况一样)。断言失败是一个错误。在断言失败后添加代码进行清理是没有意义的:只需修复错误即可。
现在释放......提供的示例代码可以忘记new
并使用自动对象:
List pList;
for (...)
{
Integer pInt = Integer();
pList.Add(pInt);
}
如果你可以使用 lambdas,你可以这样做:
ASSERT_TRUE(pInt != nullptr)
<< [pList]()->std::string { delete pList; return "Your error message."; }();
仅当断言失败时才会执行 lambda。
但是,最好的选择可能是使用std::unique_ptr
或类似的智能指针而不是原始指针,并完全避免担心。