QThread和阅读记忆

时间:2010-08-10 07:57:53

标签: memory qthread

我遇到了这样的问题。 我有一个允许通过UDP进程间通信的库。 这是非常直截了当的。该库创建可供其他进程写入和读取的共享内存。当进程想要读取感兴趣的内存时,它传递一个字符串值,该值唯一地指向相应的共享内存,并将指针传递给容器(char数组),在那里他希望接收读取结果。图书馆提供安全的多线程。

当线程离开run()例程时我有一个例外。

异常:是访问冲突,并在

中引发
void __cdecl _freeptd (
        _ptiddata ptd
        )
{
        /*
         * Do nothing unless per-thread data has been allocated for this module!
         */

        if ( __flsindex != 0xFFFFFFFF ) {

            /*
             * if parameter "ptd" is NULL, get the per-thread data pointer
             * Must NOT call _getptd because it will allocate one if none exists!
             * If FLS_GETVALUE is NULL then ptd could not have been set
             */

            if ( ptd == NULL
#ifndef _M_AMD64
                 && (FLS_GETVALUE != NULL)
#endif  /* _M_AMD64 */
                )
                ptd = FLS_GETVALUE(__flsindex);

            /*
             * Zero out the one pointer to the per-thread data block
             */

            FLS_SETVALUE(__flsindex, (LPVOID)0);

            _freefls(ptd);
        }

        if ( __getvalueindex != 0xFFFFFFFF ) {
            /*
             * Zero out the FlsGetValue pointer
             */
            TlsSetValue(__getvalueindex, (LPVOID)0);
        }
} 

代码:

char* memory = new char(2000);
string struct_name = "struct";
bool m_running = false;
void Reader::run()
{
    initalizeLibrary();
    m_running = true;
    //loop
    while(true)
    {
              if ( ! m_running ) break;
              library->readFromSharedMemory(struct_name, memory);
    }

    finalize();
}

void Reader::stop()
{
     m_running = false;
}

只有当我们允许library->readFromSharedMemory(struct_name, memory);时才会引发异常。 _freeptd无法访问导致访问冲突的内存。

我需要一只手。 Thx提前。

2 个答案:

答案 0 :(得分:1)

我认为问题就在于行

char* memory = new char(2000);

此代码表示您只想分配一个char大小的内存,并且内存将在2000年初始化。

如果您打算分配2000个字符大小的内存,则应使用此

char* memory = new char[2000];

稍后使用

删除它
delete [] memory;

我希望这可以帮助您解决访问冲突问题。

答案 1 :(得分:0)

我找到了一个解决方案:

如果您分配内存:char* memory = new char(2000); 它会失败,如果您使用char* memory = (char*) malloc(2000);然后相应地释放,它将会起作用。我想它有一些新的和不同的编译器分配内存的方式。

卢卡斯。