2009-04-05 5 views
0

構造体のCOMポインタを格納する私のプログラムは、私は構造体へのCOMポインタを格納しようとするたびにクラッシュし、その後、元のポインタを使用しようとしています。私は何が間違っているかを正確に伝えるためにデバッグアクセス権を持っていません。

pRend->cp = cpRT; 

ID2D1SolidColorBrush *scBrush; 
ERF(cpRT->CreateSolidColorBrush(D2D1::ColorF(D2D1::ColorF::CornflowerBlue), &scBrush)); 

CreateSolidColorBrushでクラッシュします。しかし、私がpRend-> cp = cpRTをコメントアウトすると、それはしません。 ところで、pRend-> cpとcpRTはID2D1HwndRenderTarget *タイプです。

答えて

0

結論として、私はpRendをmallocで割り当てることでクラッシュをやめることができました。これは私がもう必要がないときは無料で電話するので、問題はありません。私はなぜmallocを呼び出すのがこれを修正するのか興味があります。私はちょうどDatatype * var;をやって、そしてちょうどvarを使っていました。それは悪いですか?

+0

はいに置き換えなければなりません。 varは、ヒープ(mallocから)または別の変数(var =&data_var)のいずれかにターゲットを割り当てるまで、どこにでもポイントしません。ただちに使用すれば、残りの値に応じてメモリのランダムビットを上書きし、クラッシュする可能性があります。 – puetzk

+0

うわー私はそれを知らなかったO_O – scrutr

+0

mallocを使わないでください。あなたの構造体に新しいを使用してください。この方法でdelete(freeではない)を呼び出すと、スマートポインタのデストラクタが呼び出されます。 – jmucchiello

0

それはあなたが構造体にそれを割り当てて、後でCreateSolidColorBrushでそれを使用するときの間に存在するどのくらいのコードは不明です。それほど時間がかかっていない場合は、参照カウントの問題がある可能性があります。

あなたは構造体の生のポインタを格納していますか?もしそうなら、それをCComPtrに切り替え、クラッシュがなくなるかどうか確認してください。

たとえば、 pRendの値(Renderと呼ぶ)の次の型定義があり、CreateSolidColorBrush呼び出しを行う前にpRendの値が破棄された場合、この動作を確認できます。

struct Render { 
    ID2D1HwndRenderTarget *pCt; 
    ~Render() { 
    pCt->Release(); 
    } 
}; 
0

それはスマートポインタです。私はを推測しています。あなたは不注意にそのリリースを呼び出しています。特に、operator(単項演算子&)がRelease()を呼び出すためにオーバーライドされています。

は、あなたの代わりに参照、ID2D1HwndRenderTarget * &に割り当てた場合に何が起こるかを参照してください。あなたが参照に割り当てる場合

明らかに、あなたはそれを取り付け直しすることはできません。

+0

スマートポインタではありません。 – scrutr

1

代わり直接QIを割り当て、次に、すなわち店の、

pRend->cp = cpRT; 

cpRT->QueryInterface(&pRend->cp); 
+0

QueryInterface()にIIDを渡す必要はありませんか?また、この状況でQueryInterface()を呼び出す利点は何ですか?インタフェースの参照カウントをインクリメントするのでしょうか?あなたが既に適切なインタフェースポインタを持っているなら、代わりにAddRef()を呼び出さないのはなぜですか? – bk1e

+0

COMの用語では、何も直接割り当てるべきではありません。 QIを使用して行う必要があります。スマートポインタ(CComQIPtr)を使用している場合は、直接割り当てることができます。 – Vinay

+0

正しいインターフェイスポインタがすでにある場合は、はい、おそらくQI()ではなくAddRef()を呼び出す必要があります。 –