何时以及为什么会生成std :: __ non_rtti_object异常?

问题描述 投票:4回答:5

我正在使用Visual Studio并执行有效的动态投射。启用了RTTI。

编辑:更新了代码,使之更真实

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似乎无济于事。有任何想法吗?干杯。

c++ exception visual-studio-2005 rtti
5个回答
5
投票

我根据您的伪代码运行了一个测试,它可以正常工作。因此,如果在构建配置中真正启用了RTTI,那么它一定是您发布的内容中未捕获的另一个问题。


8
投票

[https://docs.microsoft.com/en-us/cpp/cpp/typeid-operator?view=vs-2019具有有关__non_rtti_object_exception的信息。

从MSDN:

如果指针未指向有效对象,会抛出__non_rtti_objectexception,指示尝试分析RTTI触发故障(例如访问违反),因为对象是某种程度上无效(指针错误或代码未使用/ GR进行编译。)>


5
投票

RTTI dynamic_cast周围的异常,故障或错误可能意味着您执行了非法转换。当且仅当类dynamic_cast<derived*>(ptrToBase)和类derived都满足以下约束时,base有效:该类或其基类之一具有虚拟成员函数。


1
投票

请确保在所有源文件中都启用了RTTI。


0
投票

base是否包含任何virtual方法?必须使dynamic_cast起作用。

© www.soinside.com 2019 - 2024. All rights reserved.