none
同一の構造体メンバにDirectXMathのXMVECTORとSTLのvectorを入れた際の構造体push_back時のエラーについて RRS feed

  • 質問

  • vectorでデータの管理をする際にデータを構造体で保持していました。その構造体の中にvectorとXMVECTORが混在している場合でデータをpush_backするとエラーが起きるバグが発生しました。

    ただし、エラーが発生するのはReleaseビルドの時のみでDebugビルドでは問題なく動作しています。Releaseビルドの最適化を行わないようにするとエラーが発生しなかったため、最適化の際に問題が発生しているのではないかと考えています。また、vectorかXMVECTORのどちらかをコメントアウトした場合も問題なく動作するため、混在時のみのエラーと考えています。

    これはどのような問題が発生しているのでしょうか。

    #include <vector>
    #include <DirectXMath.h>

    using namespace DirectX;
    using namespace std;

    struct Data{
    vector<int> vector;
    XMVECTOR xmVector;
    };

    int main (){
    Data pushData;
    vector<Data> dataVector;
    dataVector.push_back(pushData);

    return 0;
    }


    2014年10月16日 3:58

回答

  • XMVECTOR

    A portable type used to represent a vector of four 32-bit floating-point or integer components, each aligned optimally and mapped to a hardware vector register.

    と説明されているように、プロセッサ内のレジスタに格納されることを想定したデータ型です。構造体に含めたりvectorを使ってメモリに格納しようとする時点で使い方を誤っています。

    • 回答としてマーク vaiam 2014年10月16日 6:47
    2014年10月16日 6:20

すべての返信

  • エラーというのはどのようなエラーが発生するのでしょう?

    ストアアプリのフォーラムですが、ストア固有(C++/CXでのみ発生)する問題ですか?それとも、デスクトップアプリ(Native C++)でも発生しますか?

    おそらく、コピーコンストラクタと代入演算子がないことが原因だと思いますが、エラーの状況がわからないので違うかもしれません。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    2014年10月16日 4:32
  • 返信ありがとうございます。

    どちらのフォーラムに投稿すべきか迷ったためDirectXを使っている人が多いのではと推測したこちらに投稿したのですが、間違っていたかもしれません。

    上のプログラムはストア固有のものではなく単純なコンソールアプリケーションにおいて発生したエラーです。

    エラーメッセージは

    ハンドルされない例外が 0x002A1095 (ConsoleApplication.exe) で発生しました: 0xC0000005: 場所 0x00000000 の読み取り中にアクセス違反が発生しました。

    というものです。

    2014年10月16日 5:44
  • XMVECTOR

    A portable type used to represent a vector of four 32-bit floating-point or integer components, each aligned optimally and mapped to a hardware vector register.

    と説明されているように、プロセッサ内のレジスタに格納されることを想定したデータ型です。構造体に含めたりvectorを使ってメモリに格納しようとする時点で使い方を誤っています。

    • 回答としてマーク vaiam 2014年10月16日 6:47
    2014年10月16日 6:20
  • 使い方自体を間違えていたのですね。

    代わりにXMFLOATを使うようにします。

    ありがとうございました。

    2014年10月16日 6:51