多线程访问违规读取位置C ++

时间:2016-05-27 08:53:43

标签: c++ windows multithreading timer

我有一个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

1 个答案:

答案 0 :(得分:0)

事实证明,应用程序在创建计时器后立即退出,但退出并未干净地完成,因此看起来应用程序仍在运行且计时器仍在滴答作响,而实际上某些资源已经被释放,这会导致错误。

MS _tmain()显然做了 main()以外的事情。

很抱歉,它不是 _tmain(),而是 _tmain(> _tmain()。当 _tmain()退出时,会运行其他清理代码,我的项目不会以某种方式终止,应用程序仍会显示&#34; 正在运行 < /强>&#34;