node.js native addon – le destructeur de la classe wrapped ne s’exécute pas

J’écris un addon node.js en C ++. J’emballe certaines instances de classe à l’aide de node :: ObjectWrap, pour associer l’instance native à un object javascript. Mon problème est que le destructeur de l’instance encapsulée ne s’exécute jamais.

Voici un exemple:

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(Ssortingng::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::Ssortingng::New("x"), v8::Integer::New(p->x)); result->Set(v8::Ssortingng::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()); 

Je suppose que je dois configurer un WeakPointerCallback, qui supprime l’object alloué manuellement, si le garbage collector de la V8 le souhaite. Comment suis-je supposé faire ça?

La récupération de place n’est pas garantie dans V8 – elle est exécutée uniquement lorsque le moteur manque de mémoire. Malheureusement, cela signifie que vous devrez probablement appeler une fonction de publication manuellement si vous devez libérer des ressources, ce qui ne serait pas trop difficile pour les utilisateurs d’une API JS. (Vous pouvez le joindre à process.on (‘exit’) pour être sûr qu’il soit appelé.)

Commentaire sur la V8