Car*_*arl 4 c++ visual-studio-2005 exception rtti
我正在使用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 );
Run Code Online (Sandbox Code Playgroud)
我的调试器说当抛出异常时in_ptr是正确的类型.谷歌似乎特别无益.有任何想法吗?干杯.
http://msdn.microsoft.com/en-us/library/fyf39xec(VS.80).aspx有关于__non_rtti_object_exception的信息.
来自MSDN:
如果指针未指向有效对象,则抛出__non_rtti_objectexception,指示尝试分析触发故障的RTTI(如访问冲突),因为该对象在某种程度上无效(错误的指针或代码未编译为/ GR).
围绕dynamic_cast的RTTI异常,失败或错误可能意味着您执行了非法转换. dynamic_cast<derived*>(ptrToBase)当且仅当类derived和类base都满足以下约束时才有效:该类或其基类之一具有虚拟成员函数.
这个虚拟成员函数可以是任何东西,包括析构函数.如果您没有任何其他成员函数,可以尝试:
struct base
{
virtual ~base(){}
...
}
struct derived : public base
{
...
}
Run Code Online (Sandbox Code Playgroud)
现在base有一个虚拟成员函数,派生也是如此.试试看,看看它是否能解决你的问题.
编辑-ADD:
@carleeto - 在"它已经有一个虚拟析构函数"中,它是= =基数?
如果派生有虚拟析构函数但base是非虚拟dtor,那么您可能仍然会收到此错误.
此外,您应该验证对象是否已被破坏 - 一旦析构函数运行,dynamic_cast就不再安全.尝试添加跟踪到ctors和dtors.
我根据你的伪代码运行了一个测试,它的工作原理.因此,如果在构建配置中真正启用了RTTI,那么它必然是您发布的内容中未捕获的另一个问题.
| 归档时间: |
|
| 查看次数: |
10775 次 |
| 最近记录: |