私はどこのデータブロックにアクセスするためのポインタを使用するコードを持っています。まれに、データブロックのいくつかのメンバーが空であり、結果としてポインタがぶら下がってしまいます。実際、私は正しいポインタを取得しますが、ポインタで何かをしようとするとプログラムがクラッシュします。ポインタがぶら下がっているかどうかを確認する方法はありますか?
通常のアドバイスは、このタイプの使用を避けることです。しかし残念なことに、私が使用するフレームワークでは、このタイプのデータアクセスメソッドを使用する必要があります。
ポインタはそれで何らかの操作を行う前に無効な場合、私は「チェック」することができます方法はありますか?ポインタがNULLに等しくないことを確認することは、明らかに機能しませんでした。私もこれを試した:
try
{
CString csClassName = typeid(*pMyPointer).name(); // Check error condition
// The line below fails due to dangling pointer (data block is not valid).
hr = pMyPointer->MyPointerMethod();
}
catch(bad_typeid)
{
return E_FAIL;
}
catch(...)
{
return E_FAIL;
}
それは正しい方法ですか?
私のポインタはクラスに静的でなければなりません。それでも問題はありません。私はスマートポインタを使用していますか? – Nikhil
これはまったく問題ありません。あなたはスレッドの安全性の問題に気を付ける必要がありますが、それはスマートポインタと未処理ポインタの違いはありません。 –
私はそれが重要だとは思わない。私の気になる唯一のことは、あなたのフレームワークが、事前の通知なしにあなたのポインタをぶら下げるかどうかということです。あなたがスマートポインタから生のポインタを抽出してフレームワークに渡す必要があります。呼び出し後にポインタが有効なままであることが保証されている場合や、無効になった場合に通知されることが保証されていれば、それを行ってください。 – Septagram