v8 WeakCallback 永远不会被调用

2024-01-08

我知道这个问题很旧,但我找到的所有答案都不起作用并且已经过时。 但这是我的代码:

void Destroyed(const v8::WeakCallbackData<v8::Object, int>& info)
{
    std::cout << "d: " << *info.GetParameter() << std::endl;
}

std::vector<v8::Persistent<v8::Object, v8::CopyablePersistentTraits<v8::Object>>> persistent;
int i = 0;

void Constructor(const v8::FunctionCallbackInfo<v8::Value>& info)
{
    v8::HandleScope scope(v8::Isolate::GetCurrent());

    v8::Persistent<v8::Object, v8::CopyablePersistentTraits<v8::Object>> per;
    per = v8::Persistent<v8::Object>(v8::Isolate::GetCurrent(), info.This());

    per.SetWeak<int>(new int(i), Destroyed);

    persistent.push_back(per);

    ++i;

    while(!v8::V8::IdleNotification()) {}
}

void TestV8()
{
    v8::Isolate* isolate = v8::Isolate::New();

    v8::Isolate::Scope isolateScope(isolate);

    v8::HandleScope scope(isolate);

    v8::Local<v8::Context> context = v8::Context::New(isolate);

    v8::Context::Scope contextScope(context);

    v8::Local<v8::FunctionTemplate> temp = v8::FunctionTemplate::New(isolate, Constructor);

    context->Global()->Set(v8::String::NewFromUtf8(isolate, "Object"), temp->GetFunction());

    v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "while(true) {new Object();}");

    v8::Local<v8::Script> script = v8::Script::Compile(source);

    v8::Local<v8::Value> result = script->Run();

    std::cout << *v8::String::Utf8Value(result) << std::endl;
}

如果我不将持久性添加到向量中,内存不会增加。 但 Destroyed 永远不会被调用,我似乎无法弄清楚出了什么问题,请帮忙:)


我解决了,下面是工作代码。显然,持久复制构造函数没有将其复制到弱引用,因此将其转换为指针来解决它。

std::vector<v8::Persistent<v8::Object, v8::CopyablePersistentTraits<v8::Object>>*> persistent;
int i = 0;

void Destroyed(const v8::WeakCallbackData<v8::Object, int>& info)
{
    std::cout << "d: " << *info.GetParameter() << std::endl;

    persistent[*info.GetParameter()]->Reset();
}

void Constructor(const v8::FunctionCallbackInfo<v8::Value>& info)
{
    v8::HandleScope scope(v8::Isolate::GetCurrent());

    v8::Persistent<v8::Object, v8::CopyablePersistentTraits<v8::Object>>* per = new v8::Persistent<v8::Object, v8::CopyablePersistentTraits<v8::Object>>(v8::Isolate::GetCurrent(), info.This());
    per->SetWeak<int>(new int(i), Destroyed);
    persistent.push_back(per);

    ++i;

    while(!v8::V8::IdleNotification()) {}
}

void TestV8()
{
    v8::Isolate* isolate = v8::Isolate::New();
    v8::Isolate::Scope isolateScope(isolate);

    v8::HandleScope scope(isolate);

    v8::Local<v8::Context> context = v8::Context::New(isolate);
    v8::Context::Scope contextScope(context);

    v8::Local<v8::FunctionTemplate> temp = v8::FunctionTemplate::New(isolate, Constructor);

    context->Global()->Set(v8::String::NewFromUtf8(isolate, "Object"), temp->GetFunction());

    v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, "while(true) {new Object();}");
    v8::Local<v8::Script> script = v8::Script::Compile(source);
    v8::Local<v8::Value> result = script->Run();

    std::cout << *v8::String::Utf8Value(result) << std::endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

v8 WeakCallback 永远不会被调用 的相关文章

随机推荐

  • Bootstrap 网格拉/推行

    我有一个响应式引导网格 我希望根据设备宽度以不同的顺序显示它 sm 或更低 1 2 3 4 5 6 7 MD 或更高 2 4 6 1 3 5 7
  • Excel宏重复IF和Else

    我目前正在编写一个 Excel VBA 宏脚本 其中将对活动单元格进行简单的 TRUE 或 False 测试 我的问题是 直到列表末尾我才能使其正常工作 它只运行一次并结束程序 我需要这个 VB 脚本来执行 IF ELSE 测试 直到列表底
  • ASM-创建过程[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 设置了阵列A和阵列B 该过程将获取值
  • 如何在 Yocto bitbake 编译步骤中剥离和 objcopy 构建的 .so 文件?

    这个问题源于 我是否需要编辑在 Yocto 中构建 mdns 878 200 35 所需的 patch 文件 https stackoverflow com questions 66400231 do i need to edit the
  • 谷歌怎么能这么快?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 哪些技术和编程决策使 Google 能够如此快速地提供查询服务 每次我搜索某些内容 每天搜索几
  • 使用 Volley 进行令牌认证

    如果我有一个服务器 我可以使用用户名 密码进行身份验证并为后续请求获取身份验证令牌 那么解决此问题的最佳方法是什么 流程应该是这样的 开始请求 如果我们没有身份验证令牌 使用用户名和密码获取它 使用身份验证令牌发出请求 如果请求因令牌过期而
  • 如何杀死一个进程?

    我有两个活动 第一个活动由启动器启动 第二个活动由第一个活动启动 当我杀死process从第一个活动开始 该进程就被终止 但是 当我从第二个活动中杀死它时 系统将立即启动一个新进程和第一个活动 进程的PID改变了 我怎样才能干净利落地完成呢
  • Yii2 URL 映射后缀

    我在 Yii2 中有一些模拟的 URL 映射 urlManager gt enablePrettyUrl gt true showScriptName gt false rules gt pattern gt pages route gt
  • 以 Observables 作为默认值的 Angular 2 Formbuilder

    我对 Angular 2 Form formbuilder 的默认值有疑问 我的默认值是可观察的 我从服务器检索 所以我不能像这样实现它们 export class UserComponent implements OnInit userF
  • Visual Studio 2010 中 Javascript 中的区域/代码崩溃

    是否可以在 Visual Studio 2010 中的 JS 文件中创建代码区域 这个方法 https stackoverflow com questions 1921628 how to implement regions code co
  • 创建流以从Python中的字符串进行迭代

    我想在 Python 中从字符串创建一个流 这样就相当于读取字符串 就像从文本文件中读取字符串一样 就像是 for line in open myfile txt print line 除了 myfile txt 的内容存储在字符串中s 这
  • 在 Rails ActiveRecord 中,连接不适用于命名空间模型中的 has_and_belongs_to_many

    我在命名空间中有两个模型 一个服务和一个讲师 两者之间具有多对多关系 通过 has and belongs to many 定义 class Scheduling Service lt ActiveRecord Base has and b
  • 调整 JPanel 的大小以准备打印,而无需将其从原始位置移开

    在我的程序中 我经常需要打印各种 JComponent 通常是 JPanel 并且我喜欢它们是整页的 我现在的方法是使用以下代码 g2d scale pf getImageableWidth componentToPrint getWidt
  • 如何强制更新不同堆栈帧的 Python locals() 字典?

    在Python 2 不确定3 中 locals 字典仅在您实际调用 locals 时才会更新 所以例如 l locals x 2 l x 失败是因为l里面没有键 x 但是 l locals x 2 locals l x 返回 2 我正在寻找
  • 如何检查Web服务器是否启动? (C#)

    我正在构建一个监控应用程序来持续监控系统的各个方面 我本来希望使用Ping 函数来确定服务器是否已启动 但MSDN 文档 http msdn microsoft com en us library system net networkinf
  • 为 VB.net 启用Cors

    有谁知道如何将enableCors放入vb net上的控制器中 我正在参加一个pluralsight课程 并尝试了代码翻译器 但没有成功 我的尝试如下
  • 如何在react中隐藏和显示div

    嗨 我是 ReactJS 的新手 我想学习如何在按钮单击时隐藏和显示 div 这是我想隐藏的视图部分 div div img src profilePicture alt div div p John Smith p p 1 minutes
  • 从包含字母和空格的字符串中解析整数 - C#

    从包含字母和空格的字符串中解析整数的最有效方法是什么 例子 我收到以下字符串 RC 272 我想从字符串中检索 272 我正在使用 C 和 NET 2 0 框架 一个简单的正则表达式可以提取数字 然后您可以解析它 int Parse Reg
  • Windows Server 2016 上的 Visual Studio 2017 - 调试时无法检查 lambda LINQ 表达式

    我在调试 C 实体框架 应用程序时遇到了非常严重的错误 LINQ for Entities lambda 的评估Watch or Inspect窗户产量 Evaluation of method System Linq Enumerable
  • v8 WeakCallback 永远不会被调用

    我知道这个问题很旧 但我找到的所有答案都不起作用并且已经过时 但这是我的代码 void Destroyed const v8 WeakCallbackData