我有一个C ++应用程序,它具有一个主线程和一个Poco :: Timer来触发使用Poco :: FileOutputStream写入文件的回调:
FileOutputStream file("test.txt", ios::binary); <-- *Access violation reading location here*
file.write(reinterpret_cast<char *>(&data), sizeof(data));
file.close();
代码总是在第一行失败,这是调用堆栈:
testProject.exe!std :: ctype :: widen(char _Byte ='')第1716行+ 0xf字节C ++
testProject.exe!std :: basic_ios> :: widen(char _Byte ='')第126行C ++
testProject.exe!std :: basic_ios> :: init(std :: basic_streambuf> * _Strbuf = 0x038ef700,bool _Isstd = false)行135 + 0xa字节C ++
testProject.exe!std :: basic_ostream> :: basic_ostream>(std :: basic_streambuf> * _Strbuf = 0x038ef700,bool _Isstd = false)第54行C ++
testProject.exe!Poco :: FileOutputStream :: FileOutputStream(const std :: basic_string,std :: allocator>&path =“ c:\ Projects \ TestProject \ test.txt”,int mode = 32)93行+ 0xa3字节C ++
testProject.exe!OPC_Server :: OnTimer(Poco :: Timer&timer = {...})行3656 + 0x13字节C ++
testProject.exe!Poco :: TimerCallback :: invoke(Poco :: Timer&timer = {...})第212行+ 0x14字节C ++
testProject.exe!Poco :: Timer :: run()第197行+ 0x19字节C ++
testProject.exe!Poco :: PooledThread :: run()第200行+ 0x15字节C ++
Poco ::`anonymous namespace':: RunnableHolder :: run()第57行+ 0x17字节C ++
testProject.exe!Poco :: ThreadImpl :: runnableEntry(void * pThread = 0x00db6afc)第207行+ 0x20字节C ++
testProject.exe!_callthreadstartex()第348行+ 0xf字节C
testProject.exe!_threadstartex(void * ptd = 0x00db6d00)行331 C
跟踪堆栈,计时器线程似乎在读取xlocale内部标头中调用堆栈顶部的初始化_Byte时遇到问题:
_Elem __CLR_OR_THIS_CALL widen(char _Byte) const
{ // widen char
return (do_widen(_Byte)); <-- failed: Access violation reading location
}
ios标准标头中堆栈中的第二个条目:
_Elem __CLR_OR_THIS_CALL widen(char _Byte) const
{ // convert _Byte to character using imbued locale
const _Ctype& _Ctype_fac = _USE(getloc(), _Ctype);
return (_Ctype_fac.widen(_Byte)); <-- call the top of the stack
}
ios标准标头中堆栈中的第三个条目:
protected:
void __CLR_OR_THIS_CALL init(_Mysb *_Strbuf = 0,
bool _Isstd = false)
{ // initialize with stream buffer pointer
_Init(); // initialize ios_base
_Mystrbuf = _Strbuf;
_Tiestr = 0;
_Fillch = widen(' '); <-- call the second entry
但是很奇怪的是,当在主线程上使用相同的代码时,它运行良好,没有任何错误。
我需要为Poco :: Timer设置任何权限设置才能正常运行吗?还是我遗漏了一些非常明显的东西?谢谢你的帮助。
编辑:----------------------
Poco版本:1.7.3
平台:windows
最佳答案
事实证明,创建计时器后,应用程序立即退出,但是退出未完全完成,因此当实际上已经释放了某些资源时,看起来该应用程序仍在运行并且计时器仍在计时。错误。
MS的_tmain()显然比main()做得更多。
抱歉,不是_tmain(),而是_tmainCRTStartup正在调用_tmain()。当_tmain()退出时,运行其他清理代码,我的项目没有以某种方式终止,并且该应用程序似乎仍在“运行”。