none
STLのvectorでID3D10Buffer変数をコピーするには? RRS feed

  • 質問

  • CModelクラスで、 DirectX10の、
    ID3D10Buffer* m_pVertexBuffer;
    を宣言し、メインのクラスで、
    vector<CModel> m_models;
    とvector配列を宣言し、
    m_models.push_back(CModel());
    で、
    CModel& CModel::operator=(const CModel& pt)
    {
    m_pVertexBuffer = pt.m_pVertexBuffer;
    return *this;
    }
    が呼ばれて要素をコピーするはずなのですが、うまくコピーできません。

    どうやればID3D10Buffer変数をコピーできるでしょうか?
    2013年9月20日 15:04

回答

  • うまくコピーできません。
    どうやればID3D10Buffer変数をコピーできるでしょうか?

    「コピーできません」と判断した理由は何でしょうか?

    1. メンバー変数(ポインタ)に同じアドレスが格納されていない。
    2. メンバー変数(ポインタ)に同じアドレスが格納されているが、その要素を参照するとアクセス違反などの問題が生じる。
    3. その他

    疑っていくポイントとしては以下の点でしょうか。

    • CModel のコンストラクタで m_pVertexBuffer に何らかの有意な値が設定されているか
    • 掲載したコードの部分を通過しているかブレークポイントを置いて確かめる
    • CModel のデストラクタで m_pVertexBuffer を消してしまっていないか

    もし、デストラクタで消す処理が入っているなら、同じポインタを見る CModel が 2 つ同時に存在し、push_back の行が終わると片方が消してしまうので、問題ですよね。
    その場合、参照カウントを増やすなどの何らかの対策がいるように思います。
    (参照カウントを増やすだけでよいかはあなたのコード次第)

    • 回答としてマーク たけし 2013年9月21日 7:56
    2013年9月21日 3:34
    モデレータ

すべての返信

  • うまくコピーできません。
    どうやればID3D10Buffer変数をコピーできるでしょうか?

    「コピーできません」と判断した理由は何でしょうか?

    1. メンバー変数(ポインタ)に同じアドレスが格納されていない。
    2. メンバー変数(ポインタ)に同じアドレスが格納されているが、その要素を参照するとアクセス違反などの問題が生じる。
    3. その他

    疑っていくポイントとしては以下の点でしょうか。

    • CModel のコンストラクタで m_pVertexBuffer に何らかの有意な値が設定されているか
    • 掲載したコードの部分を通過しているかブレークポイントを置いて確かめる
    • CModel のデストラクタで m_pVertexBuffer を消してしまっていないか

    もし、デストラクタで消す処理が入っているなら、同じポインタを見る CModel が 2 つ同時に存在し、push_back の行が終わると片方が消してしまうので、問題ですよね。
    その場合、参照カウントを増やすなどの何らかの対策がいるように思います。
    (参照カウントを増やすだけでよいかはあなたのコード次第)

    • 回答としてマーク たけし 2013年9月21日 7:56
    2013年9月21日 3:34
    モデレータ
  • Azuleanさん、ありがとうございます。

    仰る通りCModelのデストラクタでm_pVertexBufferをReleaseしていました。

    Releaseしないようにしたらバグがなくなりました。

    DirectX9の時はこんなことはしていなかったのに、何でDirectX10ではこうしてしまったのか・・・。


    2013年9月21日 7:55