Използвайки библиотеката на Google v8 C ++, опитах сесъздаване на v8 :: UniquePersistent копие на купчината, което съдържа вътрешен указател към някаква памет, която е била разпределена в C ++ и наречена SetWeak () на Устойчивия, за да определи обратно повикване, което би направило необходимото почистване чрез дезактивиране на паметта, показалецът в "Устойчив" се отнася до това, когато тази дръжка вече не се нуждае от javascript двигателя. Въпреки че създаването на персистиращата изглежда работи, установявам, че функцията ми за обратно извикване никога не се извиква.
Тук съм напълно затънал. Някакви идеи какво да правя грешно?
Отговори:
0 за отговор № 1Обратното повикване се извиква само когато обектът е събран. Опитайте този пример:
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...
}