Firefox NPN_MemAlloc在NPN_MemFree将返回的数据拧到Google Chrome之后

Firefox NPN_MemAlloc在NPN_MemFree将返回的数据拧到Google Chrome之后,firefox,google-chrome,free,allocation,npapi,Firefox,Google Chrome,Free,Allocation,Npapi,我已经完成了我的NPAPI插件,它在Google Chrome中运行得很好,但有一个奇怪的问题。问题是我在插件中编写了一个方法,该方法向浏览器返回一个字符串。为此,您必须在浏览器中分配内存,并将生成的字符串复制到其中。比如: bool ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args, uint32_t argCount, NPVariant

我已经完成了我的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崩溃了


任何关于在这种奇怪情况下发生的事情的提示都是值得赞赏的。我正在处理它,并将在获得任何有用信息后更新线程。

您需要删除以下行:

if (m_pPtr) NPN_MemFree(m_pPtr);
您将字符串返回给脚本,调用方(在本例中是浏览器JavaScript引擎)拥有该字符串


如果您将其释放,则会导致内存仍在使用中,或已被浏览器重新使用或释放。

您需要删除以下行:

if (m_pPtr) NPN_MemFree(m_pPtr);
您将字符串返回给脚本,调用方(在本例中是浏览器JavaScript引擎)拥有该字符串


如果您将其释放,则会导致内存仍在使用中,或已被浏览器重新使用或释放。

这肯定是问题所在。要了解更多信息,请阅读NPAPI中的内存管理:这绝对是个问题。有关更多信息,请阅读NPAPI中的内存管理: