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 (将#修改为@)