Недействительные дескрипторы, которые указывают на удаленный объект C++

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

Я использую 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 ответ

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