Thanks for your reply.
I use while (!v8::V8::IdleNotification()) {} force gc to release the
memory, but that callback is not called either.
Could you please show me a right way to use SetWeak to avoid memroy leak?
Thanks



On Thu, Oct 24, 2013 at 4:41 PM, Ben Noordhuis <[email protected]> wrote:

> On Thu, Oct 24, 2013 at 5:25 AM, Yorath Wang <[email protected]> wrote:
> > I am using v8 (tag 3.22.19) built as shared library, the environment is
> > windows 8.1 x64, visual studio 2010.
> > I use External::new(ptr)  to pass the pointer to Print function, but the
> ptr
> > is allocated use new, I don't know how to free the memory.
> > Then i came across the API SetWeak, but there is no document at all. I
> try
> > to use it with the codes below, but the WeakPtrCallback is never called,
> > which leads to the memory leak.
> > Anyone knows how to deal with this problem? Thanks!
> >
> > #include <v8.h>
> > #include <vld.h>
> > #include <memory>
> >
> > void Print(const v8::FunctionCallbackInfo<v8::Value>& data) {
> >
> > }
> >
> > void WeakPtrCallback(
> >     const v8::WeakCallbackData<v8::Object, std::weak_ptr<int>>& data) {
> >   delete data.GetParameter();
> > }
> >
> > int main() {
> >   auto isolate = v8::Isolate::GetCurrent();
> >   v8::HandleScope handle_scope(isolate);
> >   auto context = v8::Context::New(isolate);
> >
> >   auto ptr = std::shared_ptr<int>(new int(3));
> >   auto data = new std::weak_ptr<int>(ptr);
> >
> >   auto global = context->Global();
> >   auto func_tpl = v8::FunctionTemplate::New(Print,
> v8::External::New(data));
> >
> >   context->Enter();
> >
> >   auto func = func_tpl->GetFunction();
> >   global->Set(v8::String::New("print"), func);
> >   auto obj = v8::Persistent<v8::Object>(isolate, global);
> >   obj.SetWeak<std::weak_ptr<int>>(data, WeakPtrCallback);
> >
> >   context->Exit();
> >   obj.Reset();
> >
> >   return 0;
> > }
>
> Your callback runs at some undefined time in the future when the
> garbage collector has determined that there are no more references to
> the weak object.  If your program is short-lived, it may never run.
>
> Of course, if you call v8::Persistent<T>::Reset(), it never runs
> because you've zapped the persistent storage cell.
>
> --
> --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "v8-users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/v8-users/FdfYWPWgX9k/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to