メモリが利用できない場合の挿入をテストするために、クラスの単体テストを作成しています。返された後にnbElementInserted
インクリメントされるという事実に依存しています。insert_edge
void test()
{
adjacency_list a(true);
MemoryVacuum no_memory_after_this_line;
bool signalReceived = false;
size_t nbElementInserted = 0;
do
{
try
{
a.insert_edge( 0, 1, true ); // this should throw
nbElementInserted++;
}
catch(std::bad_alloc &)
{
signalReceived = true;
}
}
while (!signalReceived); // this loop is necessary because the
// memory vacuum only prevents new memory
// pages from being mapped. so the first
// allocations may succeed.
CHECK_EQUAL( nbElementInserted, a.nb_edges() );
}
今、私は次の 2 つのステートメントのどちらが正しいか疑問に思っています。
- 並べ替えが発生する可能性があります。その場合、例外がスロー
nbElementInserted
される前にインクリメントされる可能性があり、それが私のケースを無効にします。insert_edge
2 つの行が並べ替えられている場合、ユーザーに表示される結果は同じであるため、並べ替えが発生する可能性があります。 insert_edge
は関数であり、次の行に進む前に関数のすべての副作用を完了する必要があるため、並べ替えは発生しません。投げるのは副作用です。
ボーナス ポイント: 正しい答えが「はい、並べ替えが発生する可能性がある」場合、2 行間のメモリ バリアはそれを修正するのに十分ですか?