未处理的异常:0x80000002:在Win CE上使用dynamic_cast时数据类型未对齐

时间:2014-05-27 06:48:56

标签: c++ exception visual-studio-2005 windows-ce

我有一个为Win 32平台编写的C ++应用程序。我正在移植此代码以支持Windows CE for ARMV4I。

在下面一行,它会抛出" 0x80000002的异常:数据类型错位":

RemotePlatformImpl* platform = dynamic_cast<RemotePlatformImpl*>(&handle);

这里的句柄类型是PlatformHandle,但实际上它指向RemotePlatformImpl对象。 RemotePlatformImpl是PlatformHandle的子类。

以下是VS2005调试器的汇编代码:

RemotePlatformImpl* platform = dynamic_cast<RemotePlatformImpl*>(&handle);
421C4F34    ldr     r3, [pc, #0x464]
421C4F38    ldr     r2, [pc, #0x45C]
421C4F3C    mov     lr, #1
421C4F40    mov     rl, #0
421C4F44    mov     r0, r8
421C4F48    str     lr, [sp]
421C4F4C    bl      421D9970

如果需要任何其他信息,请告诉我。

复制问题的最小代码:

#include "stdafx.h"
#include <windows.h>
#include <commctrl.h>
#include <string>
using namespace std;

class PlatformHandle
{
public:
    virtual ~PlatformHandle(){}

    bool operator==(const PlatformHandle& that) const { return (this == &that); }

    bool operator!=(const PlatformHandle& that) const { return !(this == &that); }

    PlatformHandle(){}
};

class RemotePlatformImpl : public PlatformHandle
{
public:
    virtual ~RemotePlatformImpl(){}
    RemotePlatformImpl(string srvAddr, int ctrlPort, int dataPort): PlatformHandle(){}
};

void justTest( PlatformHandle& handle)
{
    PlatformHandle& platform = dynamic_cast<RemotePlatformImpl&>(handle);
}
int _tmain(int argc, _TCHAR* argv[])
{
    PlatformHandle* ph = new RemotePlatformImpl("",2020,2021);
    justTest( *ph );
    return 0;
}

1 个答案:

答案 0 :(得分:2)

我通过在VS2005项目设置中启用开关来解决它:

Configuration Properties -> C/C++ -> Language -> Enable Run-Time Type Info