我有一个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&gt; :: widen(char _Byte ='')第126行C ++ testProject.exe!std :: basic_ios&gt; :: init(std :: basic_streambuf&gt; * _Strbuf = 0x038ef700,bool _Isstd = false)第135行+ 0xa字节C ++ testProject.exe!std :: basic_ostream&gt; :: basic_ostream&gt;(std :: basic_streambuf&gt; * _Strbuf = 0x038ef700,bool _Isstd = false)第54行C ++ testProject.exe!Poco :: FileOutputStream :: FileOutputStream(const std :: basic_string,std :: allocator&gt;&amp; path =“c:\ Projects \ TestProject \ test.txt”,int mode = 32)第93行+ 0xa3 bytes C ++ testProject.exe!OPC_Server :: OnTimer(Poco :: Timer&amp; timer = {...})3656行+ 0x13字节C ++ testProject.exe!Poco :: TimerCallback :: invoke(Poco :: Timer&amp; timer = {...})第212行+ 0x14字节C ++ testProject.exe!Poco :: Timer :: run()第197行+ 0x19字节C ++ testProject.exe!Poco :: PooledThread :: run()第200行+ 0x15字节C ++ testProject.exe!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
答案 0 :(得分:0)
事实证明,应用程序在创建计时器后立即退出,但退出并未干净地完成,因此看起来应用程序仍在运行且计时器仍在滴答作响,而实际上某些资源已经被释放,这会导致错误。
MS _tmain()显然做了 main()以外的事情。
很抱歉,它不是 _tmain(),而是 _tmain(> _tmain()。当 _tmain()退出时,会运行其他清理代码,我的项目不会以某种方式终止,应用程序仍会显示&#34; 正在运行 < /强>&#34;