我有一个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()退出时,运行其他清理代码,我的项目没有以某种方式终止,并且该应用程序似乎仍在“运行”。

08-04 11:50