Я хотел бы иметь возможность создавать экземпляр класса C ++ и передавать его в качестве аргумента для обратного вызова JavaScript. Класс наследуется от ObjectWrap
, и доступен и используется в Node.js.
Я могу передать экземпляры одного и того же класса в обратный вызов, если указанный экземпляр пришел из JavaScript.
Это основной пример того, что мне нужно сделать:
MyClass *instance = new MyClass();
// If was passed as the first param to this method, commit is set as below, this code works.
// MyClass *instance = ObjectWrap::Unwrap<MyClass>(args[0]->ToObject());
// Assign some property values to commit
Handle<Value> argv[] = { instance->handle_ };
ar->callback->Call(Context::GetCurrent()->Global(), 1, argv);
Это не работает, вместо этого это segfaults. gdb
говорит мне:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Как я могу изменить свой код, чтобы я мог передать свой instance
на обратный звонок?
Обновить: рассматриваемый класс можно посмотреть на Github: commit.cc.
Ответ в том, что я делал это неправильно.
Правильный код:
Local<Value> instance = MyClass::constructor_template->NewInstance();
// Assign some property values to commit
Handle<Value> argv[] = { instance };
ar->callback->Call(Context::GetCurrent()->Global(), 1, argv);
Чтобы получить MyClass
пример:
MyClass *instanceOfMyClass = ObjectWrap::Unwrap(instance);
Других решений пока нет …