首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

非常怪异的指针有关问题,

2012-03-09 
非常怪异的指针问题,高手请进.代码很少,就贴上来,大家可以做测试://iocard.hclassInterruptFace{public:vi

非常怪异的指针问题,高手请进.
代码很少,就贴上来,大家可以做测试:
//iocard.h
class   InterruptFace
{
public:
virtual   int   GetVal()=0;
};

class   CIOCard   :   public   InterruptFace
{
public:
CIOCard(){};
virtual   ~CIOCard(){};
virtual   int   GetVal(){return   10;}
};

class   CCeInterrupt
{
public:
static   CCeInterrupt*   Instance();
static   void   Release();
static   CCeInterrupt*_instance;

void   RegFace(InterruptFace*   owner){_owner   =   owner;};
void   Run();
InterruptFace*   _owner;
protected:
CCeInterrupt(){}
~CCeInterrupt(){}
};

//iocard.cpp
DWORD   WINAPI     ThreadProcIST(PVOID   pParam);
CCeInterrupt*   CCeInterrupt::_instance   =   NULL;
CCeInterrupt*   CCeInterrupt::Instance()
{
if(!_instance)
_instance   =   new   CCeInterrupt();
return   _instance;
}
void   CCeInterrupt::Release()
{
}
void   CCeInterrupt::Run()
{
HANDLE   _hThread;
DWORD   dwThreadID;
_hThread     =   CreateThread(NULL,   0,
ThreadProcIST,       //   线程
this,                         //   参数
CREATE_SUSPENDED,//   创建挂起的线程
&dwThreadID             //   线程   ID
);
ResumeThread(   _hThread   );
}

DWORD   WINAPI     ThreadProcIST(PVOID   pParam)
{
CCeInterrupt*   prun   =   (CCeInterrupt*)pParam;
int   val   =   prun-> _owner-> GetVal();   //???   调试报异常
int   aa   =   val;
//TRACE( "%d ",   val);
return   1;
}

//mydlg.cpp
BOOL   CMyDlg::OnInitDialog()
{
...
CIOCard   card;

CCeInterrupt*   run   =   CCeInterrupt::Instance();
run-> RegFace(&card);
run-> Run();
}

代码的意思是:  
1.写了个接口:   InterruptFace
2.一个非常简单的类   CIOCard继承这个接口
3.一个很简单的类CCeInterrupt,接收CIOCard的注册,然后启动一个线程.

4.问题在这个线程.   线程参数是CCeInterrupt*类型,   通过它可以访问CIOCard改写的接口函数.   但是,   访问失败: "Unhandled   exception   in   MyDlg.exe   :   0xC0000005   access   violation ".

当然,这个异常还不算最为怪异.   如果,你用一个Console工程,或者在上面的
OninitionDialog()
{
..
run-> Run();
Sleep(1000*60*3);
}
将不出现这个问题.   这是为什么呢?   高手来看看.

[解决办法]
CIOCard card;在线程执行的时候已经被释放。
建议将card声明为全局变量或则阻塞Run函数知道线程结束。
[解决办法]
楼上正解。run-> Run();之后OnInitDialog退出,run被销毁,此时线程试图访问run,引起VA异常

热点排行