在 Node.js 里,“Node 扩展”通常指 C/C++ Addon(原生扩展,如 .node 模块),也可能指 Electron 主进程的 Node 扩展。内存管理这块,核心区别在于:JS 层由 V8 自动 GC,C++ 层要你自己管,而且 JS 和 C++ 之间还有“桥接内存”。
下面按层次说清楚。
{}、数组、字符串new / mallocstd::vector、char*、Buffer 底层数据❌ 错误示例:
int* p = new int(10);
// 返回给 JS,没人帮你 delete
✅ 正确方式:
Napi::ExternalNapi::BufferNapi::External<int> ext = Napi::External<int>::New(
env,
new int(42),
[](Napi::Env, int* data) {
delete data;
}
);
externalNapi::Buffer<char> buf = Napi::Buffer<char>::New(env, 1024);
// V8 管理内存
char* data = new char[1024];
Napi::Buffer<char> buf = Napi::Buffer<char>::New(
env,
data,
1024,
[](Napi::Env, char* d) {
delete[] d;
}
);
⚠️ 否则:
static Napi::Reference<Napi::Object> ref;
ref = Napi::Persistent(obj);
Persistent 会让对象不被 GCref.Reset();
✅ 谁创建,谁负责释放
✅ 跨边界对象必须有明确 owner
✅ 用 Finalizer(析构回调)而不是定时清理
可能原因:
Persistent 没释放External 没写 destructor--trace-gcprocess.memoryUsage()heapdump(JS 层)Node 扩展的内存管理 = V8 自动 GC + C++ 手动管理 + 明确的跨语言所有权
如果你愿意,可以告诉我:
我可以直接给你对应模板代码或排查清单。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。