Родной аддон node.js - деструктор упакованного класса не запускается - PullRequest
8 голосов
/ 14 июля 2011

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

Вот пример:

point.cc

#include <node.h>
#include <v8.h>

#include <iostream>

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<Value> 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<Object> target){
        HandleScope scope;

        Local<FunctionTemplate> 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<Value> get(const Arguments &args){
        HandleScope scope;
        Point *p = ObjectWrap::Unwrap<Point>(args.This());
        Local<Object> 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<Object> 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.Как мне это сделать?

1 Ответ

7 голосов
/ 07 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...