Pomocou knižnice v8 jazyka C ++ spoločnosti Google som to skúsilvytvorenie inštancie v8 :: UniquePersistent na halde, ktorá obsahuje interný ukazovateľ na časť pamäte, ktorá bola pridelená v C ++, a nazvanú SetWeak () v skupine Persistent na určenie spätného volania, ktoré by vykonalo potrebné vyčistenie uvoľnením pamäte, že interná ukazovateľ v Perzistentné odkazuje na prípady, keď tento javový modul už javascriptový stroj nepotrebuje. Aj keď sa zdá, že vytvorenie Perzistenta funguje, zisťujem, že moja funkcia spätného volania sa nikdy nevyvolá.
Som tu úplne na dne. Máte nejaké nápady, čo by som mohol robiť zle?
odpovede:
0 pre odpoveď č. 1Spätné volanie sa vyvolá iba vtedy, keď je objekt zbavený odpadu. Vyskúšajte tento príklad:
void callback(v8::WeakCallbackData<v8::Object, int> data)
{
Local<Object> val = data.GetValue();
int* ptr = retinterpret_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...
}