私はVisual Studioを使用しており、有効な動的キャストを行っています。 RTTIが有効になります。いつ、なぜstd :: __ non_rtti_object例外が生成されますか?
編集:より現実的なように、コードを更新しました
struct base
{
virtual base* Clone()
{
base* ptr = new base;
CopyValuesTo(ptr);
return ptr;
}
virtual void CopyValuesTo(base* ptr)
{
...
}
virtual ~base()
{
}
}
struct derived : public base
{
virtual base* Clone()
{
derived* ptr = new derived;
CopyValuesTo(ptr);
return ptr;
}
virtual void CopyValuesTo(base* ptr)
{
...
}
virtual ~derived()
{
}
}
void Class1::UseNewSpec(base* in_ptr) //part of a totally unrelated class
{
derived* ptr = dynamic_cast<derived *>(in_ptr);
if(!ptr)
return;
delete m_ptr;
m_ptr = ptr->Clone(); //m_ptr is a member of Class1 of type base*
}
//usage :
Class1 obj;
derived new_spec;
obj.UseNewSpec(&new_spec);
私のデバッガは、例外がスローされたときin_ptrが正しい型であることを述べています。 Googleは特に役に立たないようだ。何か案は?乾杯。
実際のコードを投稿してください。 – dirkgently
ここに使用シナリオがあります: UseNewSpecはGUIノブにリンクされています。ノブを変更すると、UseNewSpecが呼び出されます。それは、ノブがゆっくりと動いたときに機能しますが、実際に速く動いたときにはこの例外を表示します。 – Carl
ありがとうございます。私はそれを理解した。これはスレッドの問題でした。他の場所のコードでは、ダイナミックキャストの直前にポインタが無効になっていました。 – Carl