Node.js уничтожение объекта аддона

Я пишу базу данных графического процессора и смотрю на использование javascript в качестве языка для запроса с использованием node.js.

Я пишу аддон узла, как я написал базу данных GPU на C ++. Однако у меня есть проблема с моим аддоном node.js, так как мои объекты c ++ не разрушаются, а только когда я явно не использую оператор new. Если я использую оператор new, это нормально, это просто когда вызывается метод, который создает новый метод — например, copy () и т. Д. Я использую V8 :: AdjustAmountOfExternalAllocatedMemory (size ()) как указание на V8, что у меня есть выделенная внешняя память (на графическом процессоре).

Пожалуйста, мог бы я получить совет.

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. Однако этот фрагмент кода не вызывает деструктор объектов для освобождения памяти графического процессора.

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();
}

3

Решение

Без конструктора GpuArray немного сложнее сказать, что не так.

Но я вижу некоторые вещи, которые не так:

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

//...
}

Вы разворачиваете GpuVector объект, из GpuArray объект, который не так.

Методы Wrap / Unwrap должны использоваться для установления связи между объектами c ++ и их соответствующими объектами js, а не между различными объектами.

Из кода, который вы опубликовали, похоже (но я могу ошибаться), что вы пытаетесь клонировать объект, если я прав, это должно быть сделано так:

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 );
}

Я не проверял код, но он должен работатьтеоретически.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]