Ich verwende Visual Studio und führe eine gültige dynamische Besetzung durch. RTTI ist aktiviert.Wann und warum wird eine std :: __ non_rtti_object-Ausnahme generiert?
Edit: der Code aktualisiert realistischere
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);
Mein Debugger zu sein, sagt, dass in_ptr vom richtigen Typ ist, wenn die Ausnahme ausgelöst wird. Google scheint besonders wenig hilfreich zu sein. Irgendwelche Ideen? Prost.
Geben Sie einen echten Code ein. – dirkgently
Hier ist ein Verwendungsszenario: UseNewSpec ist mit einem GUI-Regler verknüpft. Wenn der Knopf geändert wird, wird UseNewSpec aufgerufen. Es funktioniert, wenn der Knopf langsam bewegt wird, aber dies macht den Unterschied, wenn er sich sehr schnell bewegt. – Carl
Danke Jungs.Ich habe es herausgefunden. Es war ein Threading-Problem - etwas schäbiger Code an anderer Stelle führte dazu, dass der Zeiger unmittelbar vor der Dynamic-Umwandlung ungültig wurde. – Carl