NPN_MemAlloc после того, как NPN_MemFree прикрутит возвращаемые данные в Google Chrome

Я закончил свой плагин NPAPI, и он отлично работает в Google Chrome, но возникла странная проблема. Проблема в том, что я написал в плагине метод, который возвращает строку в браузер. Для этого вам нужно выделить память в браузере и скопировать в нее полученную строку. Что-то типа:

bool
ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,
                               uint32_t argCount, NPVariant *result)
{
    if (name == sMethod_id) {
  ...

  //free the memory if it is already allocated
  if (m_pPtr) NPN_MemFree(m_pPtr);

  //allocate the string in the browser memory
  m_pPtr = (char*)NPN_MemAlloc(size+1);
  SecureZeroMemory(m_pPtr, size+1);
  memcpy(m_pATR, string, size);

  //send result to browser
  STRINGZ_TO_NPVARIANT(m_pPtr, *result);

  return true;
 }
  ...

}

Обратите внимание, что 'm_pPtr' является членом данных класса и инициализируется значением NULL при построении. Проблема возникает, когда я дважды вызываю этот метод из Google Chrome. Первое время работает отлично. Со второго раза и так далее он возвращает значение мусора, отображаемое «X» в браузере. Я протестировал тот же плагин в Firefox, и он отлично работает и возвращает правильное значение независимо от того, сколько раз я вызываю метод. Но когда я закрываю страницу, на которой загружен плагин, Firefox падает.

Приветствуются любые указания на то, что происходит в этой странной ситуации. Я работаю над этим и обновлю ветку, как только получу любую полезную информацию.


person Saleh    schedule 14.09.2010    source источник


Ответы (1)


Вам нужно удалить следующую строку:

if (m_pPtr) NPN_MemFree(m_pPtr);

Вы возвращаете строку скрипту, и вызывающая сторона (в данном случае движок JavaScript браузера) владеет ею.

Если вы освободите ее, это приведет к неопределенному поведению, так как память может все еще использоваться или уже занята. -используется или освобождается браузером.

person Georg Fritzsche    schedule 21.09.2010
comment
Это определенно проблема. Для получения дополнительной информации прочитайте об управлении памятью в NPAPI: colonelpanic.net/2009 /12/управление-памятью-в-npapi - person taxilian; 26.10.2010