When you declare Persistent<Function> fn
in your code, fn
is a stack-allocated variable.
fn
is a Persistent<Function>
, which is a handle class, and it will contain a pointer to some heap-allocated value of type Function
, but fn
itself is on the stack.
This means that when you call registerListener(&callback, &fn)
, &fn
is taking the address of the handle (type Persistent<Function>
), not the address of the Function
on the heap. When your function exits, the handle will be destroyed but the Function
itself will remain on the heap.
So as a fix, I suggest passing the address of the Function
instead of the address of the handle, like this:
Persistent<Function> fn = Persistent<Function>::New(Handle<Function>::Cast(args[0]));
Local<Number> num = Number::New(registerListener(&callback, *fn));
(note that operator*
on a Persistent<T>
returns a T*
rather than the more conventional T&
, c.f. http://bespin.cz/~ondras/html/classv8_1_1Handle.html)
You'll also have to adjust callback
to account for the fact that context
is now a raw pointer to a Function
, like this:
Persistent<Function> func = static_cast<Function*>(context);
func->Call((* func), 1, args);
Creating a Persistent<Function>
from a raw Function pointer here is OK because we know that context
is actually a persistent object.
I've also changed (*func)->Call(...)
to func->Call(...)
for brevity; they do the same thing for V8 handles.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…