2010-08-10 65 views
0

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

当线程离开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); 
     } 
} 

代码提出:只有当我们允许library->readFromSharedMemory(struct_name, memory);

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; 
} 

异常。 _freeptd无法访问导致访问冲突的内存。

我需要一只手。 Thx提前。

回答

0

我已经找到了解决办法:

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

Lukasz。

1

我认为这个问题是行

char* memory = new char(2000); 

该代码表示​​要分配一个唯一的内存字符大小,以及存储器由2000

如果你的意图来分配初始化内存2000个字符的大小,你应该使用这个

char* memory = new char[2000]; 

然后再用

删除
delete [] memory; 

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