Недействительные дескрипторы, которые указывают на удаленный объект C ++ - PullRequest
4 голосов
/ 28 февраля 2012

Когда объект C ++, доступный для v8, удаляется, как я могу сделать недействительными дескрипторы, которые могут указывать на этот объект.

Я использую v8 в качестве интерфейса сценариев для более крупного приложения.Объекты в более крупном приложении оборачиваются и доступны в v8 с использованием класса ObjectWrap узла.

Проблема заключается в том, что время жизни обернутых объектов ограничено.Если в javascript я выполняю что-то вроде:

var win = app.getWindow();
win.close(); // The C++ object that win references goes away
console.log(win.width()); // This should fail.

, я хочу, чтобы он вел себя так, как говорится в комментариях.После win.close () (или какого-либо другого события, возможно, вне контроля JS) любой доступ к win или дублированному дескриптору должен завершиться сбоем.

В настоящее время я должен пометить обернутый объект C ++ как недействительный и проверитьдопустимость при каждом вызове метода.Это единственный способ сделать это, или есть способ пометить дескриптор как недействительный?

1 Ответ

1 голос
/ 28 февраля 2012

Единственный способ, который приходит на ум, - использовать дополнительную функцию, которая выдает ошибку при вызове. Затем, когда вы вызываете «.close», вы можете создать на вашем win свойства, которые будут иметь приоритет над версиями прототипа объекта.

function closedError() {
  return new Error("Window Closed");
}

win.close = function() {
  this.width = closedError;
  this.otherfunc = closedError;
};

В данный момент у меня нет удобного компилятора, но я представляю что-то подобное в C ++.

static Handle<Value> Close(const Arguments& args) {
  HandleScope scope;
  NODE_SET_METHOD(args.This(), "width", Window::Width);
  NODE_SET_METHOD(args.This(), "otherfunc", Window::OtherFunc);
}
...