Intereting Posts
Поиск пересечения между двумя коллекциями в MongoDb NodeJS: совместное использование состояния приложения между модулями Как использовать неупорядоченную объемную вставку с помощью Mongoskin? Как загрузить изображение в s3 в узле Как преобразовать код Step в Async.JS (Step => waterfall, this.parallel)? PassportJS – использование нескольких папок в приложении Express Возможно ли создать новую базу данных в MongoDB с помощью Mongoose? Моделирование данных для специальной электронной коммерции Сайт в аэрокосмическом NodeJS, это плохая практика, чтобы вернуть res.json Попытка понять документацию nodejs. Как определить параметры обратного вызова Получение hashа файла с использованием возможностей streamа криптового модуля (то есть: без hash.update и hash.digest) Как написать файл объявления TypeScript для сложного внешнего модуля commonjs с конструктором, например imap? Существуют ли подстановочные знаки для Firebase Fuctions на хранилище? пересылка grunt подключается к другому URL-адресу Почему я получаю ошибки при запуске команды кофе в cygwin?

node.js native addon – деструктор обернутого classа не запускается

Я пишу add.js addon в C ++. Я переношу некоторые экземпляры classа с помощью node :: ObjectWrap, чтобы связать собственный экземпляр с объектом javascript. Моя проблема заключается в том, что деструктор обернутого экземпляра никогда не запускается.

Вот пример:

point.cc

#include  #include  #include  using namespace v8; using namespace node; class Point :ObjectWrap { protected: int x; int y; public: Point(int x, int y) :x(x), y(y) { std::cout << "point constructs" << std::endl; } ~Point() { std::cout << "point destructs" << std::endl; } static Handle New(const Arguments &args){ HandleScope scope; // arg check is omitted for brevity Point *point = new Point(args[0]->Int32Value(), args[1]->Int32Value()); point->Wrap(args.This()); return scope.Close(args.This()); } static void Initialize(Handle target){ HandleScope scope; Local t = FunctionTemplate::New(New); t->InstanceTemplate()->SetInternalFieldCount(1); NODE_SET_PROTOTYPE_METHOD(t, "get", Point::get); target->Set(String::NewSymbol("Point"), t->GetFunction()); } static Handle get(const Arguments &args){ HandleScope scope; Point *p = ObjectWrap::Unwrap(args.This()); Local result = Object::New(); result->Set(v8::String::New("x"), v8::Integer::New(p->x)); result->Set(v8::String::New("y"), v8::Integer::New(p->y)); return scope.Close(result); } }; extern "C" void init(Handle target) { HandleScope scope; Point::Initialize(target); }; 

test.js

 var pointer = require('./build/default/point'); var p = new pointer.Point(1,2); console.log(p.get()); 

Я предполагаю, что мне нужно установить WeakPointerCallback, который удаляет объект, выделенный вручную, если захочет его сборщик мусора V8. Как я должен это делать?

Сбор мусора в V8 не гарантируется – он выполняется только в том случае, когда у двигателя заканчивается память. К сожалению, это означает, что вам, вероятно, придется вручную вызвать функцию выпуска, если вам нужно освободить ресурсы – что не будет слишком велико для пользователей JS API. (Вы можете прикрепить его к process.on (‘exit’), чтобы убедиться, что он вызван.)

Комментарий к V8