2010-08-10 95 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; 

我希望這可以幫助您解決訪問衝突問題。