未调用v8持久性setWeak回调 使用谷歌的V8C++库,我尝试在堆上创建一个V8:UnjistCurvor实例,该堆保存一个内部指针,指向C++中分配的一些内存,并在持久性上调用SETFISH(),以指定回调,当javascript引擎不再需要该句柄时,它将通过释放持久化中的内部指针所引用的内存来进行必要的清理。尽管创建持久性似乎有效,但我发现我的回调函数从未被调用

未调用v8持久性setWeak回调 使用谷歌的V8C++库,我尝试在堆上创建一个V8:UnjistCurvor实例,该堆保存一个内部指针,指向C++中分配的一些内存,并在持久性上调用SETFISH(),以指定回调,当javascript引擎不再需要该句柄时,它将通过释放持久化中的内部指针所引用的内存来进行必要的清理。尽管创建持久性似乎有效,但我发现我的回调函数从未被调用,c++,v8,C++,V8,我在这里完全被难住了。知道我做错了什么吗?只有当对象被垃圾收集时才会调用回调。试试这个例子: void callback(v8::WeakCallbackData<v8::Object, int> data) { Local<Object> val = data.GetValue(); int* ptr = reinterpret_cast<int*>(val->GetAlignedPointerFromINternalField(0));

我在这里完全被难住了。知道我做错了什么吗?

只有当对象被
垃圾
收集时才会调用
回调。试试这个例子:

void callback(v8::WeakCallbackData<v8::Object, int> data)
{
   Local<Object> val = data.GetValue();
   int* ptr = reinterpret_cast<int*>(val->GetAlignedPointerFromINternalField(0));
   delete ptr;
   fprintf(stdout, "Deleted internal object!\n");
}

void main()
{
  using namespace v8;

  // Enable garbage collection
  const char* flags = "--expose_gc";
  v8::V8::SetFlagsFromStrings(flags, strlen(flags));

  Isolate isolate = Isolate::New();
  isolate->Enter();
  HandleScope scope(isolate);
  Eternal<v8::Context> context;
  Local<ObjectTemplate> ctx_template  ObjectTemplate::New(isolate);
  context.Set(isolate, Context::New(isolate, nullptr, ctx_template);

  Local<ObjectTemplate> obj_template = ObjectTemplate::New(isolate);
  obj_template->SetInternalFieldCount(1);
  Local<Object> obj = Local<Object>(isolate, obj_template->NewInstance());
  obj->SetAlignedPointerInInternalField(0, new int);
  UniquePersistent<Object> persistent(isolate, obj);
  persistent->SetWeak(nullptr, callback);

  //...do something with persistent

  persistent.Reset();

  isolate->RequestGarbageCollectionForTesting(v8::Isolate::kFullGarbageCollection);
  // You should see output from the callback
  // i need to add more words to pass edit word num check...
}
void回调(v8::WeakCallbackData)
{
Local val=data.GetValue();
int*ptr=reinterpret_cast(val->GetAlignedPointerFromINternalField(0));
删除ptr;
fprintf(标准输出,“已删除的内部对象!\n”);
}
void main()
{
使用名称空间v8;
//启用垃圾收集
const char*flags=“--expose_gc”;
v8::v8::SetFlagsFromString(标志,strlen(标志));
隔离=隔离::新建();
隔离->输入();
手镜范围(隔离);
永恒的语境;
本地ctx_模板ObjectTemplate::新建(隔离);
Set(隔离,上下文::新建(隔离,空ptr,ctx_模板);
本地对象模板=对象模板::新建(隔离);
obj_模板->设置内部字段计数(1);
Local obj=Local(隔离,obj_模板->NewInstance());
obj->SetAlignedPointerInInternalField(0,新整数);
唯一持久(分离,obj);
持久->设置弱(空ptr,回调);
//…坚持不懈地做某事
persistent.Reset();
隔离->请求GarbageCollectionforTesting(v8::隔离::kFullGarbageCollection);
//您应该看到回调的输出
//我需要添加更多单词以通过编辑单词数检查。。。
}
来自v8文档:“无法保证何时或是否调用回调。调用仅在尽最大努力的基础上执行。与往常一样,任何关键形式的资源管理都不应依赖基于GC的终结!”另请参见: