Я пишу базу данных графического процессора и смотрю на использование 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();
}
Без конструктора 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 );
}
Я не проверял код, но он должен работатьтеоретически.
Других решений пока нет …