【发布时间】:2014-03-29 20:53:00
【问题描述】:
我正在编写一个 GPU 数据库并研究使用 javascript 作为语言来查询使用 node.js。
我一直在编写节点插件,因为我已经用 C++ 编写了 GPU 数据库。但是我的 node.js 插件有问题,因为我的 c++ 对象没有被破坏,但只有当我没有明确使用 new 运算符时。如果我使用 new 运算符,那很好,只是在调用创建新方法的方法时——比如 copy() 等。我使用 V8::AdjustAmountOfExternalAllocatedMemory(size()) 作为 V8 的指示,我有分配的外部内存(在 GPU 上)。
请给我一些建议。
1.正确释放 GPU 内存的代码
这段代码通过调用对象析构函数正确地释放了 GPU 内存,这会调用释放 GPU 内存:
var gpudb = require('./build/Release/gpudb');
var n = 1000000;
for (var i = 0; i < 10000; ++i) {
var col = new gpudb.GpuArray(n);
}
2。但是,这段代码不会调用对象的析构函数来释放 GPU 内存。
var gpudb = require('./build/Release/gpudb');
var n = 1000000;
var col = new gpudb.GpuArray(n);
for (var i = 0; i < 10000; ++i) {
var copyOfCol = col.copy();
}
3.现在,分别是构造函数和复制函数的函数。
Handle<Value> GpuVector::New(const Arguments& args) {
HandleScope scope;
if (args.IsConstructCall()) {
// Invoked as constructor: `new GpuVector(...)`
int value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
GpuVector* obj = new GpuVector(value);
obj->Wrap(args.This());
return args.This();
} else {
// Invoked as plain function `GpuVector(...)`, turn into construct call.
const int argc = 1;
Local<Value> argv[argc] = { args[0] };
return scope.Close(constructor->NewInstance(argc, argv));
}
}
Handle<Value> GpuArray::Copy(const Arguments& args) {
HandleScope scope;
GpuArray* in = ObjectWrap::Unwrap<GpuVector>(args.This());
GpuArray* out = new GpuArray(in); // creates new gpu memory slot and copies the data over
out->Wrap(args.This());
return args.This();
}
【问题讨论】:
标签: c++ node.js v8 embedded-v8