2

これはおそらくばかげたエラーですが、それを修正しようとすると私は頭がおかしくなります。

私は構造体を持っています:

struct MarkerData
{  
 int pattId;
 unsigned short boneId;
 Ogre::Matrix4 transToBone;
 Ogre::Vector3 translation;
 Ogre::Quaternion orientation;

 MarkerData(int p_id, unsigned short b_id, Ogre::Matrix4 trans)
 {
  pattId = p_id;
  boneId = b_id;
  transToBone = trans;
 }
};

そしてクラス:

class TrackingSystem
{
 public:
  void addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone);

 private:  
  std::vector <MarkerData> mMarkers;
};

ここで、addMarkerメソッドで:

    void TrackingSystem::addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone)
{
    mMarkers.push_back(MarkerData(pattId,boneId,transToBone));
}

このpush_backにより、アクセス違反が発生します。「OgreAR.exeの0x00471679で未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00000018」。

テストとして、私はこれを試しました:

void TrackingSystem::addMarker(int pattId, unsigned short boneId, Ogre::Matrix4 transToBone)
    {
        std::vector <MarkerData> test;
        test.push_back(MarkerData(pattId,boneId,transToBone));
    }

これは正常に機能します。

私は何が間違っているのですか?!ありがとう!

4

6 に答える 6

7

TrackingSystem呼び出しているオブジェクトが停止しaddMarkerている(およびポインターが無効である)可能性が高いですthis。スコープ外にあるか、deleteが途中で呼び出されたか、正しく作成されなかった(ポインターがまだnullである)可能性があります。

ローカルベクトルへのpush_backが正常に機能するため、これはさらに可能性が高くなります。

于 2010-10-01T15:07:21.067 に答える
3

これは通常、次のようなことをしている場合に発生する可能性があります

TrackingSystem* p = new TrackingSystem();
delete p; //or p = 0, or anything that makes p not point to the object anymore
p->AddMarker( 0, 0, Ogre::Matrix4() );

またはさらに簡単

TrackingSystem* p;
p->AddMarker( 0, 0, Ogre::Matrix4() );

ところで、不要なコピーを避けるために、const参照として3番目の引数を渡す方が良い場合があります。

于 2010-10-01T15:06:20.740 に答える
2

申し訳ありませんが、私はマペットでした。TrackSystemのインスタンスは、addMarkerを呼び出す前に初期化されませんでした。

時間の無駄になってしまったことをお詫びします!

于 2010-10-01T15:15:25.470 に答える
1

デバッグのためだけに、試してみてください

void TrackingSystem::addMarker( int pattId, unsigned short boneId, Ogre::Matrix4 transToBone)
{
    MarketData m( pattId, boneId, transToBone);
    mMarkers.push_back( m ); 
}

次に、デバッガーを使用してそこにアクセスし、何が起こっているかを確認します。他の場所でメモリの破損が発生している可能性があります。この関数呼び出しに入ると、TrackingSystemのこのインスタンスのmMarkersベクトルが破損しています。

于 2010-10-01T14:55:56.527 に答える
0

これらは、提供された情報に基づく単なる推測です。

  1. MarkerData ctorは平行移動または方向を初期化しないため、デフォルトで初期化されます。それで十分ですか?(ちなみに、割り当ての代わりにそのctorのメンバー初期化リストを使用してください。そして、そのMatrix4オブジェクトを値ではなくconst参照で渡します。)

  2. ceretullisには良い提案があります。質問に投稿されたコードでは、一時的なMarkerDataオブジェクトの構築中にクラッシュが発生したのか、push_back呼び出し中にクラッシュが発生したのかを実際に確認することはできません。

  3. 「アクセス違反の読み取り場所0x00000018」に基づいています。これはおそらく、どこかで逆参照されているnullポインターがあるために発生しています。そのnullポインターがどこにあるかを確認するのに十分なコードを示していないか、Ogreライブラリのどこかにある可能性があります。

  4. あなたのテストは、スタックに関連する問題があることを示唆しています。ベクトルをメンバー変数としてではなくスタック上で宣言すると、スタックフレームのレイアウトが変更されます。作成される一時的なMarkerDataもスタックに作成されます。行ったテストに問題がない場合は、スタックレイアウトの違いが原因である可能性があります。おそらく、MarkerDataのコピーコンストラクターにバッファオーバーフローがあります。これは、例では数回呼び出されます。

于 2010-10-01T15:08:20.330 に答える
0

お元気ですかTrackingSystem::addMarker()

万が一、それはNULL(または偽物)によるものTrackingSystem*ですか?

于 2010-10-01T15:11:05.907 に答える