2010-08-10 4 views
0

У меня возникла такая проблема. У меня есть библиотека, которая позволяет через UDP межпроцессное общение. Это очень прямолинейно. Библиотека создает общую память, доступную для других процессов для записи и чтения. Когда процесс хочет прочитать интересующую память, он передает строковое значение, которое однозначно указывает на соответствующую общую память и передает указатель на контейнер (массив символов), где он ожидает получить результат чтения. Библиотека обеспечивает безопасную многопоточность.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); 
     } 
} 

код:

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 заранее.

ответ

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; 

Надеюсь, это поможет вам устранить проблему нарушения прав доступа.

Смежные вопросы