3

ユースケースのシナリオがあります。

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

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

}

ここで、pIntいずれかの反復で null になる必要がある場合、このテスト ケースは停止し、pList解放されません。

実行pList時に解放する方法はありますか?ASSERT_TRUE

ありがとう

4

2 に答える 2

2

ラムダを使用できる場合は、次のことができます。

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

ラムダは、アサーションが失敗した場合にのみ実行されます。

ただし、最善のオプションはstd::unique_ptr、生のポインターではなく、または同様のスマートポインターを使用し、心配を完全に回避することです。

于 2012-09-26T20:49:39.723 に答える
2

ここで、pIntいずれかの反復で null になる必要がある場合、このテスト ケースは停止し、pList解放されません。

演算子をオーバーライドしていないと仮定するとnew(オーバーライドした場合、おそらくこれについて質問することはないでしょう)、コンパイラにバグがないと仮定すると、pIntnull になることはありません。失敗newすると例外がスローされ、 std::bad_allocnull は返されません。

さらに、アサーションは、何があっても (その場合のように)常に保持されるべきもののためのものです。アサーションの失敗はバグです。アサーションの失敗後にクリーンアップするためにコードを追加しても意味がありません。代わりにバグを修正するだけです。

解放へ...提供されたサンプルコードは、自動オブジェクトを忘れnewて使用することができます:

List pList;
for (...)
{

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