2012-02-27 3 views
4

객체 ++ 처리합니다.무효화 삭제 된 C를 가리키는 내가이 개체를 지적 할 수있다 핸들을 무효화 할 수있는 방법, V8에 노출되는 C++ 객체가 삭제됩니다

나는 더 큰 응용 프로그램에 스크립팅 인터페이스로 V8을 사용하고 있습니다. 큰 응용 프로그램의 객체는 노드의 ObjectWrap 클래스를 사용하여 v8에서 래핑되고 액세스됩니다.

문제는 래핑 객체의 수명은 제한된다. 자바 스크립트에서 다음과 같이 실행하면 :

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 또는 duplicated 핸들에 대한 액세스가 실패해야합니다.

현재, 나는 무효로 랩 된 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); 
} 
+0

흥미 가능한 솔루션. 모든 메소드를 오류 메소드로 설정하여 핸들을 "파기"하는 함수를 쉽게 작성할 수 있습니다. – aughey

+0

모든 기능을 검사하는 것이 덜 복잡해 보입니다. 즉, 매크로를 만들었다면 모든 기능의 맨 위에 수표를 붙이는 것이 매우 쉽습니다. – loganfsmyth