C++ Node.js加载项对象销毁

C++ Node.js加载项对象销毁,c++,node.js,v8,embedded-v8,C++,Node.js,V8,Embedded V8,我正在编写一个GPU数据库,并考虑使用javascript作为语言来查询node.js 当我在C++中编写GPU数据库时,我一直在写一个节点插件。但是,我的No.js Addon有问题,因为我的C++对象没有被破坏,但只有当我没有显式使用新的操作符时。如果我使用的是new操作符,那很好,只是在调用一个创建新方法的方法时,比如copy(),等等。我使用V8::AdjustAmountOfExternalAllocatedMemory(size())向V8表示我已经分配了外部内存(在GPU上) 请给

我正在编写一个GPU数据库,并考虑使用javascript作为语言来查询node.js

当我在C++中编写GPU数据库时,我一直在写一个节点插件。但是,我的No.js Addon有问题,因为我的C++对象没有被破坏,但只有当我没有显式使用新的操作符时。如果我使用的是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);
}
var-gpudb=require('./build/Release/gpudb');
var n=1000000;
对于(变量i=0;i<10000;++i){
var col=新的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();
}
var-gpudb=require('./build/Release/gpudb');
var n=1000000;
var col=新的gpudb.GpuArray(n);
对于(变量i=0;i<10000;++i){
var copyocol=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();
}
handlegpuvector::New(常量参数和参数){
手镜镜;
if(args.IsConstructCall()){
//作为构造函数调用:`new GpuVector(…)`
int value=args[0]->IsUndefined()?0:args[0]->NumberValue();
GpuVector*obj=新的GpuVector(值);
obj->Wrap(args.This());
返回args.This();
}否则{
//作为普通函数“GpuVector(…)”调用,转换为构造调用。
常数int argc=1;
本地argv[argc]={args[0]};
返回scope.Close(构造函数->新实例(argc,argv));
}
}
句柄GpuArray::Copy(常量参数和参数){
手镜镜;
GpuArray*in=ObjectWrap::Unwrap(args.This());
GpuArray*out=new-GpuArray(in);//创建新的gpu内存插槽并将数据复制到
out->Wrap(args.This());
返回args.This();
}

如果没有GpuArray构造函数,就很难判断出什么是错的

但我可以看到一些不正确的东西:

Handle<Value> GpuArray::Copy(const Arguments& args) {
    //...
    GpuArray* in = ObjectWrap::Unwrap<GpuVector>(args.This());

    //...
}
我没有测试代码,但理论上应该可以

Handle<Value> GpuArray::Copy(const Arguments& args) {
    HandleScope scope;

    GpuArray* in = ObjectWrap::Unwrap<GpuArray>( args.This() );

    //build argc and argv here

    Local<Object> outJs = constructorOfGpuArray->NewInstance( argc, argv );
    GpuArray* out = ObjectWrap::Unwrap<GpuArray>( outJs );

    //set members/etc of the "out" object so it looks identical to the "in" object

    //return the js object to the caller.
    return scope.Close( outJs );
}