2016-05-04 8 views
2

私はランダムに失敗するテストをしています。私は、ポインター値で順序付けられたstd :: setのオブジェクトの順序が原因であると考えています。 しかし、私の現在のexeでは、テストは常にパスします。私のセットのオブジェクトの順序が2つの実行の間で異なるように、ポインタの作成を「ミックス」できる方法はありますか?ランダムstd :: setを再現する<T*>オーダー

つまり、特定のC++コードに対してポインタの「並べ替え順」(p1 < p2)ですか、別のコンパイルや異なる実行で異なるソート順を持つことはできますか?

たとえば、このコードでは、p1とp2の作成の間に「p1b.reset(nullptr)」を追加すると、p1/p2の「ソート順」が逆転します。ソースコードを変更することなく、この順序に影響を与える他の方法はありますか?

int main(void) 
{ 
    std::unique_ptr<MyClass> p1b(new MyClass()); 

    //Lot of code, with memory allocated/deallocated 

    std::unique_ptr<MyClass> p1(new MyClass()); 

    //p1b.reset(nullptr); 

    //Lot of code, with memory allocated/deallocated 

    std::unique_ptr<MyClass> p2(new MyClass()); 

    std::cout << "p1: " << p1.get() << std::endl; 
    std::cout << "p2: " << p2.get() << std::endl; 
} 

を与える: "p1b.reset(nullptr)" で

p1: 0x171c030 
p2: 0x171c050 

をコメントアウト:

p1: 0x21f9030 
p2: 0x21f9010 
+1

さらに詳しく説明できますか?おそらく動作するコードスニペットを提供しますか? – WhiZTiM

答えて

-2

あなたは、ヒープ上のオブジェクトを割り当てるためには、完全にあなた次第です。ところで、破棄されるとstd::setが破棄されるのは、ポインタが単に存在しないということを意味するポインタの場合にのみ、デストラクタが呼び出されるということです。ポインタはヒープに残っていて、 stdコンテナにプレーンポインタを格納する場合は、手動でdeleteを忘れないでください。

2

EDIT 2:つまりhttps://stackoverflow.com/revisions/37027675/3

、 "ソート順" である(p1 < p2)ポインタ 与えられたC++コードの決定論的、あるいはませ異なるコンパイルまたは の:あなたの編集に基づいて、異なるランは異なるソート順を持つことができますか?

はい、ヒープに割り当てると、メモリアロケータによって返されたポインタアドレスの「昇順」が保証されないため、いつでも変更できます。答えの残りの部分を読んでください。


EDIT 1:あなたの編集に基づいて:https://stackoverflow.com/revisions/37027675/2

たとえば、このコードでは、p1b.reset(nullptr)p2p1間と 作成を追加するp1/p2順序を反転します。 この注文に影響する他の方法はありますか?

いいえ、それは作成順序を「反転」、あなたはp1を破壊し、他のオブジェクト(おそらく同じ)を作成し、それがp1の場所を取る持っていません。最初の答えを読む..


初期回答

は私のセットで オブジェクトの順序は、二つの実験間で異なっているので、私はポインタの作品を「ミックス」することができます方法はありますか?

メモリアロケータは連続してメモリを割り当てます。そのため、1つのスレッドプログラムで要素を連続して割り当てると、連続したメモリアドレスになる可能性があります。しかし、絶対ポインタアドレスに関しては、Address space layout randomization

のように、プログラムの実行ごとに「異なる」絶対オフセットになる可能性があります。連続した要素のメモリアドレスをランダムにするそのランダムな方法で作成するか、単純に作成する順序で作成する必要があります。

ランダムな方法で... ...私の頭の上でオフ:おそらく、作成するオブジェクトのインデックスのstd::vectorを生成します。 vectorをランダム化(またはシャッフル)し、オブジェクトを作成するベクターの要素を実行します。


私の上記の回答はあなたの疑いに基づいています。しかし、再び、私はこれを不快にしています:

私はポインタ値に命じ のstd ::セット内のオブジェクトの順序にがランダム失敗は、私が原因疑うテストを持っています。しかし、私の現在のexeでは、 テストは常にを渡します。

Undefined Behaviorsをチェックして、コードでメモリツールとスタティックアナライザを実行してください。

+0

これは私が簡単なプログラムで観察したものです。しかし、私の実際の人生の例では、異なるコンパイルの結果が異なります。私は、異なる動作を再現しようとするためにこの順序に動的に影響を与えることができるかどうか疑問に思っていました。 –

+0

@MickaëlG、Ok ...しかし、正確に何をしたのか、結果は何か、達成しようとしていることを説明する最小限のコードスニペットを投稿できますか? – WhiZTiM

+0

p1/p2順序について:もちろん、作成順序は反転しませんが、p1とp2の「並べ替え」順序のみが反転します。オブジェクトがセットに追加され、セットが反復された場合、p1とp2は反転されます。与えられたC++コードに対してポインタの「ソートされた順序」が確定的か、異なるコンパイルや異なる実行が異なるソート順を持つことができますか? –

関連する問題