2

dominoes.erase()タイプの whichを呼び出すたびにstd::vector<Domino>、セグメンテーション違反が発生します。値をハードコーディングしても。

別のメンバー関数を呼び出しdominoes.push_back()てデータをロードpop_back()し、ベクターからドミノを削除して返すために使用できるので、そこにデータがあることがわかります。Domino オブジェクトに対してコピー コンストラクターを作成しましたが、問題なく動作します。まで絞り込みましたdominoes.erase()

Domino::Domino( const Domino &d ) {
    left = d.getHighPip();
    right = d.getLowPip();

}
Domino DominoCollection::drawDomino( void )
{

    int index = random.nextNumber( dominoes.size()  );
    Domino d( dominoes[index] );
    dominoes.erase( dominoes.begin() + index );

    return Domino( d );
}

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

5

不要なコード (オブジェクトのコピー、ベクトル アクセスなど) をすべて削除して、エラーを絞り込んでください。次に、問題が実際に に起因する場合はerase、ガードを追加して、インデックスが正しいことを確認します。次のコードで再試行してください。

#include <cassert>
void DominoCollection::drawDomino( void )
{
    assert(dominoes.size() != 0 && "Your vector is empty");
    int index = random.nextNumber( dominoes.size()  );
    assert(index < dominoes.size() && "Buffer overflow...");
    dominoes.erase( dominoes.begin() + index );
}

それでもセグメンテーション違反が発生する場合は、クラスのデストラクタに問題がありDominoます。そこに怪しいものがあるかどうか見てください。問題の原因を知るために、デストラクタの一部 (またはそのすべて) にコメントを付けることで簡単なテストを行うことができます。を呼び出すeraseと、 のデストラクタが呼び出されますDomino

cerrデストラクタが実装されていない場合は、出力が含まれているもの ( on 、 not )を実装して、coutそこに到達するか、早期にクラッシュするかを確認することをお勧めします。Domino派生クラスですか?その中に他のオブジェクトがありますか、それともプリミティブ型の構成のみですか?

編集

私はあなたのコードをすばやく調べました:問題は代入演算子から来ています:

Domino & Domino::operator = ( const Domino & d )
{
    *this = d;
}

これは書かれるべき方法ではありません...演習としてデバッグさせてください。

それがバグの原因である理由については、あなたはeraseクラッシュしたと言いましたが、そうではありませんでしpop_backた。2 つの主な違い (明らかな意味上の違いではなく、実装の違い) は、要素を連続して格納する必要がある=ため、削除すると (演算子を使用して)削除された要素の後にすべての要素が移動することです。std::vectorpop は末尾のポインターを変更するだけで、コンテナーの残りの部分は変更しません。

于 2013-04-21T20:52:41.583 に答える