微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Node NAPI 从动态库中释放内存的正确方法

如何解决Node NAPI 从动态库中释放内存的正确方法

我目前正在编写一个模块,其中一部分加载一个动态库并创建本机工作程序来执行动态库的功能。动态库的函数是用golang编写的,它们接受一个char*并返回一个不同的char*。当我没有在 golang 中明确释放分配的内存时,我会出现内存泄漏。如果我这样做,它会在一段时间后崩溃并显示退出代码,如 3221225477 或 3221226356。

因此,我的问题是如何正确释放从 napi 分配到 napi 之外的内存。

class DllFuncWorker: public Napi::AsyncWorker {
    public:
        DllFuncWorker(Napi::Function& callback,std::string config)
        : Napi::AsyncWorker(callback),config(config),response("")
        {
        }

        ~DllFuncWorker() {}
    
    protected:
    void Execute() override {
      if(hGetProcIDDLL == NULL){
        response = "{\"Error\":\"dll was not loaded\"}";
        return;
      }
      response = dllFunc(config.c_str());
      config.clear();
    }

    void OnError(const Napi::Error& e) override
    {
      Napi::Env env = Env();

      Callback().MakeCallback(
        Receiver().Value(),{
          e.Value(),env.Undefined()
        }
      );
    }

    void OnOK() override {
        Callback().Call({Env().Null(),Napi::String::New(Env(),response)});
    }

    private:
        char* response;
        std::string config;
};

Napi::Value queueDllFuncWorker(const Napi::CallbackInfo& info) {
  Napi::Env env = info.Env();
  if (info.Length() < 2) {
    Napi::TypeError::New(env,"Wrong number of arguments")
        .ThrowAsJavaScriptException();
    return env.Null();
  }

  if (!info[0].Isstring()) {
    Napi::TypeError::New(env,"{\"Error\":\"invalid config parameter\"}").ThrowAsJavaScriptException();
    return env.Null();
  }

  if (!info[1].IsFunction()) {
    Napi::TypeError::New(env,"{\"Error\":\"invalid callback function\"}").ThrowAsJavaScriptException();
    return env.Null();
  }

  std::string str = info[0].ToString().Utf8Value();

  Napi::Function cb = info[1].As<Napi::Function>();

  DllFuncWorker* dllFuncWorker= new DllFuncWorker(cb,str);
  dllFuncWorker->Queue();
  return info.Env().Undefined();
}

Napi::Object Init(Napi::Env env,Napi::Object exports) {
  exports.Set(Napi::String::New(env,"dllFunc"),Napi::Function::New(env,queueDllFuncWorker));
  return exports;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。