QThread и чтение памяти - PullRequest
       12

QThread и чтение памяти

0 голосов
/ 10 августа 2010

Я столкнулся с такой проблемой. У меня есть библиотека, которая позволяет через межпроцессное взаимодействие 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 не может получить доступ к памяти, которая вызывает нарушение прав доступа.

Мне нужна рука. Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 19 ноября 2013

Я думаю, что проблема в линии

char* memory = new char(2000);

этот код означает, что вы хотите выделить только один символ памяти, а память инициализируется к 2000 году.

Если вы намереваетесь выделить объем памяти в 2000 символов, вам следует использовать это

char* memory = new char[2000];

И удалите его позже, используя

delete [] memory;

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

0 голосов
/ 11 августа 2010

Я нашел решение:

если вы выделите память: char* memory = new char(2000); это не удастся, если вы будете использовать char* memory = (char*) malloc(2000); и затем освободите соответствующим образом, это будет работать. Я предполагаю, что у него есть что-то с новым и другим способом выделения памяти компилятором.

Лукаш.

...