1

メモリが利用できない場合の挿入をテストするために、クラスの単体テストを作成しています。返された後に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_edge2 つの行が並べ替えられている場合、ユーザーに表示される結果は同じであるため、並べ替えが発生する可能性があります。
  • insert_edgeは関数であり、次の行に進む前に関数のすべての副作用を完了する必要があるため、並べ替えは発生しません。投げるのは副作用です。

ボーナス ポイント: 正しい答えが「はい、並べ替えが発生する可能性がある」場合、2 行間のメモリ バリアはそれを修正するのに十分ですか?

4

1 に答える 1