读书人

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

发布时间: 2012-03-09 21:42:52 作者: rapoo

非常怪异的指针问题,高手请进.
代码很少,就贴上来,大家可以做测试:
//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异常

读书人网 >VC/MFC

热点推荐