昨天晚上遇到这问题的时候,改变下编译顺序偶尔能解决,今天做了个test的工程,改变编译顺序还是不行,在bcb下编译可以正常运行,下面就把代码贴上来,5个文件,是不是大家也遇到过这样的问题,都怎么解决的。// main.cpp#include <stdio.h>
#include <stdlib.h>
#include "opcode.h"
#include "handler.h"int main()
{
Handler h;
int cnt = 10;
while(cnt--)
{
int i = rand() % O_MAX;
h.process(i);
}
return 0;
}// handler.h#pragma onceclass Handler
{
public:
void process(int i);
void handleNull();
};//handler.cpp#include "handler.h"
#include "stdio.h"
#include "opcode.h"void Handler::process(int i)
{
const HandlerTableItem& item = handleTable[i];
(this->*item.handler)();
}void Handler::handleNull()
{
printf("handleNull\n");
}//opcode.h#pragma onceclass Handler;enum Opcode
{
O_NULL,
O_ENTER,
O_LEAVE,
O_MAX
};struct HandlerTableItem
{
void (Handler::*handler)();
};extern HandlerTableItem handleTable[O_MAX];//opcode.cpp#include "opcode.h"#include "handler.h"HandlerTableItem handleTable[O_MAX] = 
{
&Handler::handleNull,
&Handler::handleNull,
&Handler::handleNull,
};

解决方案 »

  1.   

    会在取    const HandlerTableItem& item = handleTable[i]; 得到错误的 item,里面的成员函数指针是零
      

  2.   

    错误是:会在取 const HandlerTableItem& item = handleTable[i]; 得到错误的 item,里面的成员函数指针是零,然后后面的函数调用就飞地址0上面去了
      

  3.   

     int i = rand() % O_MAX;
            h.process(i);
    =========>
    改成: int i = ((int) rand()) % O_MAX;
            h.process(i);
      

  4.   

    rand()返回的就是int型,其他地方应该没有问题,就是那个取item的地方,不知道vc的其他版本有没有问题。
    正确的话,应该是能调用到handleNull的方法的,然后输出10次handleNull退出
      

  5.   

    handleTable换成这样的也是一样问题
    HandlerTableItem handleTable[O_MAX] = 
    {
    {&Handler::handleNull},
    {&Handler::handleNull},
    {&Handler::handleNull},
    };
      

  6.   

    HandlerTableItem handleTable[O_MAX] = 
    {
        &Handler::handleNull,
        &Handler::handleNull,
        &Handler::handleNull,
    };
    void Handler::process(int i)
    {
        const HandlerTableItem& item = handleTable[i];
        (this->*item.handler)();
    }void Handler::handleNull()
    {
        printf("handleNull\n");
    }
      

  7.   

    应该是个vc9的bug我不再至直接访问handleTable数组了,在那个.h上声明一个函数来访问
      

  8.   

    如果真是bug提交给ms吧,如果不是,也能加深自己的理解,大家一起学习点东西.