2

カスタム比較クラスとカスタムクラスをキーとして使用するstd::mapを使用します

ここで、operator[]を使用してキーで要素にアクセスします。しかし、これは大きな問題を引き起こすようです。マップが要素を誤って割り当てているように見えるか、要素が破損しています。これは、比較するオブジェクトの1つがデータフィールドに任意の値を格納していることを検出すると、カスタム比較クラスが例外をスローするためです(これは、コンストラクターが実行されなかったか、オブジェクトが作成されなかったことを意味しているようです。最初の場所)

ここで、別の不一致が現れます。

std :: map :: size()を呼び出して、begin()イテレータをインクリメントしてend()イテレータに到達できる回数と比較すると、一致しません。

具体的には、マップは明らかに含まれているよりも大きいsize()を報告します。

キーとして使用するクラスは、データフィールドを持つカスタムマトリックスクラスです。

unsigned int
unsigned int
vector<vector<Another Class>>

ただし、これらのクラスのいずれでも、ポインタ演算など、メモリを直接操作できるものは使用していません。また、使用されているクラスのいずれにもカスタム定義のコピーコンストラクターはありません。

編集:比較機能

struct SymModMatComp
{
  bool operator()(const ModMat& mat1, const ModMat& mat2) const
  {
    unsigned int rows = mat1.get_row_number();

    unsigned int columns = mat1.get_column_number();
    if(mat2.get_row_number() != rows || mat2.get_column_number() != columns)
    {
      throw dimension_mismatch();
    }
    for(unsigned int i = 0; i < rows; i++)
    {
      for(unsigned int j = 0; j < columns; j++)
      {
        if(mat1.get_item(i,j).get_value() < mat2.get_item(i,j).get_value())
        {
          return true;
        }
        else if(mat1.get_item(i,j).get_value() > mat2.get_item(i,j).get_value())
        {
          return false;
        }
      }
    }
    return false;
  }
}

get_value()はunsignedintを返します

解決済み:

valgrindを使用して、メモリアクセスエラーをチェックしました...プログラムactuallzのまったく関係のない部分が、すでに削除されたオブジェクトを何度も削除したことがわかりました...。

これにより、マップにアイテムが保存されているスペースが破損したようです。

しかし、すべての良いアイデアをありがとう!

4

2 に答える 2

1

コードがないと推測するのは難しいですが、とにかく試してみます。

T& operator[] ( const key_type& x ) ;を認識していますか? キーが存在しない場合、マップに値を挿入しますか? そのため、マップにキーがまだない場合、マップのサイズは 1 ずつ大きくなります。

要素は、デフォルトのコンストラクターを使用して作成されます。

于 2012-10-29T10:52:01.817 に答える
0

複雑なユーザー定義のキーで破損が発生している場合は、比較関数が厳密な弱い順序付けmapの要件を尊重していない可能性があります。

  • 非反射性:!(x < x)
  • 非対称:!(x < y && y < x)
  • 推移性:x < y && y < z -> x < z
  • 比較不能の推移性:!(x < y || y < x || y < z || z < y) -> !(x < z || z < x)

これらの要件のいずれかが満たされない場合、未定義の動作 (メモリの破損など) が発生します。

行列が比較関数に関与する場合、厳密な弱い順序付けを確実にする簡単な方法は、その要素に対して辞書式順序付けを使用することです。

于 2012-10-29T10:53:55.613 に答える