如何正确使用lua_pop()函数?

2023-11-23

谁能告诉我如何在 C++ 中正确使用 lua_pop() 函数。

  • 当我使用 lua_get*() 函数时我应该调用它吗?喜欢。

    lua_getglobal(L, "某事");

    lua_pop(L, 1);

或者如何使用它?垃圾收集器会在阈值之后清除这些东西吗?谢谢。


你打电话lua_pop()从 Lua 堆栈中删除项目。对于简单的函数,这可能完全没有必要,因为核心将清理堆栈作为处理返回值的一部分。

对于更复杂的函数,尤其是调用 Lua 的 C 代码,您通常需要从堆栈中弹出内容以防止堆栈无限增长。

The lua_getglobal()函数在调用时向堆栈添加一项,即nil如果全局不存在或指定全局变量的值。只要该值存在,在堆栈上保存该值的副本就可以保护它免受垃圾收集器的影响。只要检索它的 C 代码正在使用该值,就需要保留在堆栈上,因为如果修改全局值,堆栈上的副本可能是唯一剩余的引用。

所以使用全局的一般模式是这样的:

void doMyEvent(lua_State *L) {
    lua_getglobal(L, "MyEvent");
    lua_call(L, 0, 0);  /* pops the function and 0 parameters, pushes 0 results */
}

double getGlobalDouble(lua_State *L, const char *name) {
    double d;
    lua_getglobal(L,name);
    d = lua_tonumber(L,1); /* extracts the value, leaves stack unchanged */
    lua_pop(L,1);          /* pop the value to leave stack balanced */
    return d;
}

char *copyGlobalString(lua_State *L, const char *name) {
    char *s = NULL;
    lua_getglobal(L,name);
    if (!lua_isnil(L,-1))
        s = strdup(lua_tostring(L,-1));
    lua_pop(L,1);
    return s;
}

在最后一个示例中,我小心地复制了字符串的内容,因为返回的指针lua_tostring()仅当该值保留在堆栈中时才保证有效。要求调用者copyGlobalString()负责打电话free() later.

另请注意,最新版本的Lua手册每个函数都包含一个符号,用于标识消耗的堆栈条目数和推送的数。这有助于避免意外的堆栈增长。

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

如何正确使用lua_pop()函数? 的相关文章

  • 循环内的局部变量会被垃圾收集吗?

    我想知道将循环内引用的任何变量放在循环外是否更有效 或者它们可以像函数内的变量一样被垃圾收集吗 var obj key val for var i 0 i lt 10 i console log obj or for var i 0 i l
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 使用带有终结器的 C++/CLI 定义类时 C# 中的内存泄漏

    当我在 C CLI DLL 中实现一个类时 public ref class DummyClass protected DummyClass some dummy code std cout lt lt hello lt lt std en
  • Lua C API:初始化结构体 C 中的变量矩阵

    我正在尝试使用 Lua C API 创建一个用户数据 并在其中关联一个元表 我将在其中收集矩阵 我无法得到的是如何将初始化矩阵的每个分量设置为零 我按照我的描述编译我的 Lua 模块 C 代码here https stackoverflow
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr
  • 使用 using 来处理嵌套对象

    如果我有像这样的嵌套对象的代码 我是否需要使用嵌套的 using 语句来确保 SQLCommand 和 SQLConnection 对象都被正确处理 如下所示 或者如果实例化 SQLCommand 的代码位于外部使用语句 using var
  • 如果垃圾收集器没有删除未引用的对象,它们还能运行吗?

    如果一个对象正在等待垃圾收集 但包含一个在该对象的最后一个引用更改时正在运行的线程 那么该线程是否仍会运行并且代码是否仍会执行 那么您是否可能有一堆应该删除的幽灵对象 但它们对您的代码产生了影响 你如何防止这种情况发生 有没有办法让对象知道
  • 匿名监听器与弱引用不兼容吗?

    我正在阅读刚刚被问到的这个问题 避免回调中的内存泄漏 https stackoverflow com questions 8475314 我很困惑 直到有人回答了以下问题 这种方法的问题是你不能拥有一个仅在集合中引用的侦听器 因为它会随机消
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但
  • 内存分配/释放瓶颈?

    在典型的实际程序中 内存分配 释放的瓶颈有多大 欢迎来自性能通常很重要的任何类型的程序的答案 malloc free 垃圾收集的正确实现是否足够快 以至于它只是少数极端情况下的瓶颈 或者大多数性能关键型软件会从尝试减少内存分配量或拥有更快的
  • 替代 __del__ 来获得最终结果并终止类中的进程?

    这个虚拟类类似于我当前的项目 class EndProcess object def init self self Q multiprocessing Queue self p1 multiprocessing Process target
  • 如何从 Lua 字符串中删除所有特殊字符、标点符号和空格?

    在Lua中 我只能找到其他语言的示例 如何从字符串中删除所有标点符号 特殊字符和空格 所以 举例来说 s t r i p p e d会成为stripped In Lua 模式 https www lua org manual 5 3 man
  • Python:当为变量分配新内容时,“旧”内存是否被释放?

    如果为变量分配了任何新内容 为 旧内容 分配的内存是否会 正确 释放 例如 在以下脚本中 在为 a 分配一些新内容后 变量 a 作为零数组的内存是否会被释放 import numpy a numpy zeros 1000 a a 1 我想象
  • 如何从表成员中引用lua表成员?

    我在 lua 有一张表 enUS LOCALE STHOUSANDS Thousands separator e g comma patNumber d LOCALE STHOUSANDS d regex to find a number
  • 将值存储在 lua 的 userdata 对象中

    我想做的是这样的 object foo bar print object foo 其中 对象 是用户数据 我已经用谷歌搜索了一段时间 使用关键字 newindex 和 lua rawset 但我找不到任何可以实现我想要的功能的示例 我想用
  • Linq 是如何工作的(在幕后)?

    我正在考虑为 Lua 制作类似 Linq 的东西 并且我大致了解 Linq 的工作原理 但想知道是否有一篇好文章 或者是否有人可以解释 C 如何使 Linq 成为可能 注意 我的意思是在幕后 比如它如何生成代码绑定等等 而不是最终用户语法
  • 创建对象的弱引用

    Actionscript 3 中是否可以创建对对象的弱引用 以便可以对其进行垃圾收集 我正在创建一些类以使调试更容易 因此如果仅在此处引用这些对象 我不希望这些对象挂在内存中 当然我不想用回调填充代码以删除对象 格兰特 斯金纳 Grant
  • 为什么当达到 InitiatingHeapOccupancyPercent 时 G1 不开始标记周期?

    根据文档 http www oracle com technetwork articles java g1gc 1984535 html XX InitiatingHeapOccupancyPercent 设置触发标记周期的Java堆占用阈
  • 构建自动化和 MySQL Workbench 脚本:正向工程师 SQL CREATE SCRIPT

    我目前正在研究自动化软件构建过程 其中包括 MySQL Workbench 中定义的数据库架构 使用 Workbench 的脚本编写功能 我想打开一个 Workbench 文档并将其架构导出为 SQL CREATE 脚本 我想知道是否有一个

随机推荐

  • Prolog:带有内置命令的“Vanilla”元解释器

    这个答案Jan Burse 展示了 Prolog 中元解释器最简单的实现之一 solve true solve A B solve A solve B solve H clause H B solve B 我想扩展这个解释器 以便它可以调用
  • 如何将cURL转换为axios请求

    我正在尝试将 cURL 请求转换为here到 axios curl d grant type client credentials client id YOUR APPLICATION S CLIENT ID client secret Y
  • 具有多客户端通信的 Java 服务器。

    我正在为一项任务制作一个游戏 我有一个用 Java 设置的服务器和多客户端 我们使用的是 MVC 我需要让客户端将他们的名字发送到服务器 然后当有两个玩家存在时 我需要将两个名字以及他们的玩家编号 玩家一或玩家二 发送回客户端 我不明白如何
  • 如何在 C# 中的控制台窗口上显示列表项

    我有一个List包含所有数据库名称 我必须在控制台中显示该列表中包含的项目 使用Console WriteLine 我怎样才能实现这个目标 实际上你可以做得很简单 因为列表有一个ForEach方法 因为你可以传入Console WriteL
  • Python Tornado - 困惑如何将阻塞函数转换为非阻塞函数

    假设我有一个长时间运行的函数 def long running function result future Future result 0 for i in xrange 500000 result i result future set
  • { } 和等号变量之间的区别

    我对 C 编程有点陌生 我在谷歌上找不到我的答案 所以希望它能在这里得到答案 以下之间有区别吗 unsigned int counter 1 or unsigned int counter 1 这本书使用了第一个选项 它让我感到困惑 因为它
  • 检查 typescript 类是否有 setter/getter

    我有一个打字稿类 它具有以下属性 export class apiAccount private balance apiMoney get balance apiMoney return this balance set balance v
  • 在iPhone上,是否可以查出我们连接的是哪个WIFI网络?

    如果是的话 我们还可以获得有关网络配置的其他信息吗 一种有用的方法是获取当前网络的 SSID 有 API 可以做到这一点吗 更新 我在这里发现了类似的问题 iPhone SDK能否获取当前连接的Wi Fi SSID 尝试以下方法 impor
  • Java 可变长度参数与数组,简单的语法糖?

    我正在当地社区大学学习数据结构和算法课程 以获取乐趣 该课程的教材是Y Daniel Liang的Java 编程简介 第 10 版 这本书本身非常扎实 在处理Java util Arrays Liang提到了Java的 可变长度 参数 他写
  • Three.js 鼠标按下时旋转对象并移动

    我试图在场景中获得良好的鼠标移动 以便我可以围绕对象旋转 我有两个问题 我可以弄清楚如何限制运动 使其永远不会在 Y 轴上旋转低于 0 度 我不想从下面看到物体 只想从上面看到 而我想不通的第二件事就是如何让动作变得流畅 现在我在 jsfi
  • 如何在Spring中进行条件自动装配?

    有没有人尝试过根据条件将不同的 bean 自动连接到 Spring 管理的 bean 中 例如如果满足某些条件 则注入A类 否则注入B类 我在 Google 搜索结果之一中看到可以使用 SpEL Spring 表达式语言 但无法找到工作示例
  • 使用 terraform 获取 Route53 上托管域的 zone_id

    您好 我正在使用 terraform 创建 Route53 记录 我已经有一个托管域 公共 可以说example com如何获取其 zone id 并附加到记录 如何获取现有 Route53 托管区域的 zone id 我已经编写了一个文件
  • SQL如何比较两个不同表中的两列

    我有两个表 其中表 1 包含 4 列 表 2 包含 8 列 我在 table1 中有两列 我想将它们与 table2 中的两列进行比较 Table 1 have column1 and column2 that needs to be co
  • 由于 PHP 版本,Apache 中的 PHPMyAdmin 500 内部服务器错误

    Version OS lsb release a Ubuntu 18 04 5 LTS PHP php v 8 0 1 Apache apache2 v 2 4 29 Ubuntu MySQL mysql version mysql 版本
  • 如何最小起订量功能

    尝试对其构造函数采用 Func 的类进行单元测试 不知道如何使用 Moq 来模拟它 public class FooBar public FooBar Func
  • 如何防止使用 Git 自动合并?

    我正在尝试将本地分支合并到主分支中 而无需 Git 进行自动合并 我想 手工挑选 我想要合并到 master 中的内容 当我使用 Git 的 difftool 命令时 我可以比较并选择要添加到 master 分支中的内容 但是当我进行合并时
  • 当属性可以抛出异常时对象初始值设定项和 Dispose

    我有以下设置 public class SomeClass private DirectoryEntry root private DirectorySearcher searcher public SomeClass root new D
  • 带有变量赋值的基本 vue.js 2 和 vue-resource http get

    我真的很难让最基本的 REST 功能在 vue js 2 中工作 我想从某个端点获取数据并将返回值分配给我的 Vue 实例的变量 这是我已经走了多远 var link https jsonplaceholder typicode com u
  • .split(/\s+/) 和 .split(" ") 之间的区别?

    首先 抱歉我的英语不好 p 我正在查看下一个 js 代码片段 var classes element className split s 该代码会将 和 元素的完整类名拆分为包含每个类的数组 但是 使用之间有什么区别 split s 并使用
  • 如何正确使用lua_pop()函数?

    谁能告诉我如何在 C 中正确使用 lua pop 函数 当我使用 lua get 函数时我应该调用它吗 喜欢 lua getglobal L 某事 lua pop L 1 或者如何使用它 垃圾收集器会在阈值之后清除这些东西吗 谢谢 你打电话