0

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

当线程离开 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无法访问导致访问冲突的内存。

我需要一只手。提前谢谢。

4

2 回答 2

1

我认为问题在于线路

char* memory = new char(2000);

此代码意味着您只想分配一个 char 大小的内存,并且内存由 2000 初始化。

如果你打算分配 2000 个字符大小的内存,你应该使用这个

char* memory = new char[2000];

稍后使用删除它

delete [] memory;

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

于 2013-11-19T09:06:59.120 回答
0

我找到了一个解决方案:

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

卢卡斯。

于 2010-08-11T08:30:01.077 回答