关于lua闭包导致引用无法释放内存泄露

摘要:
最近,该项目出现了严重的内存泄漏问题。每次级别削减都会增加20M无法释放的内存。在搜索项目并使用多种工具后,我们发现项目中存在两种内存泄漏。1.应及时释放lua封闭件的不当使用。

最近项目存在严重的内存泄漏问题,每次切level 会增加20M无法释放的内存,翻遍了项目用了多个工具,查询资料等

发现项目中两种存在内存泄露的情况

1.lua闭包的不当使用,对比包的引用要及时 释放。

2.注册事件未及时取消订阅,注册到C#的luafunction 用完一定要dispose,委托事件要对应取消订阅或清空事件。

lua闭包写法

function BaseCtrl:genSelfFuncCallback(fn)
    local that = self;
    return function ()
        fn(that);
    end
end

使用时需要注意,出现引用无法释放的情况

1.将该返回值赋值给一个变量,则会导致闭包return function 一直处于引用状态,需要将该变量重新赋值,如

local a = self:genSelfFuncCallback(self.func) --此时a引用了闭包的function 由于function有应用 function会一直存在切function内的变量会一直存在包括局部变量
a()    --执行但是 a不会释放该引用
a = nil     --重新赋值 使a 释放对闭包的引用这样闭包的引用才能被GC回收

2.如果只是执行没有引用闭包 则不会出现无法释放 执行过后会自动回收

切记切记 对闭包的引用要及时释放 否则内存泄露

另外要注意事件的订阅和取消:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events

关于lua闭包导致引用无法释放内存泄露第1张

免责声明:文章转载自《关于lua闭包导致引用无法释放内存泄露》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何在网页中嵌入百度地图【WPF】查找父/子控件(元素、节点)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Lua中table的实现-《Lua设计与实现》

本文来自《Lua设计与实现》的阅读笔记,推荐Lua学习者可以购买一本,深入浅出讲解lua的设计和实现原理,很赞,哈哈   Lua中对于表的设计,是基于数组和散列表,和其他语言不同,对于数组的下标是从1开始的,对于散列表而言,只要其键值补位nil,都可以存储在其中。   一、table的基本类型定义 首先看看table的数据定义,参考源码lobject.h...

lua 模块与包(五)

一.模块的介绍   模块类似于1个封装库,从Lua 5.1 开始,Lua加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,用利于代码的重用和降低代码的耦合度。 1.定义一个模块 --- lua的模块是由变量、函数等已知元素组成的table,因此创建1个模块就是创建1个table,把 --- 需要导出的常...

深入探究Lua的GC算法(下)-《Lua设计与实现》

紧接着上一篇文章zblade:深入探究Lua的GC算法(上)-《Lua设计与实现》 这篇文章让我们收尾GC的具体后续操作。转载请标明出处:http://www.cnblogs.com/zblade/ 3、GC的扫描阶段 GCSpropagate 只要处于这个阶段,就会分2种情况执行,一个是propagatemark,一个是atomic,让我们分别看...

lua语言(2):闭包、模式匹配、日期、编译、模块

lua中的闭包 在lua语言中,函数是严格遵循词法定界(lexical scoping)的第一类值(first-class value)。 第一类值意味着lua语言中的函数与其它常见类型的值(例如数值和字符串)具有同等权限:一个程序可以将某个函数保存到变量、或表中,也可以将函数作为参数传递给另外一个函数,还可以将函数作为某个函数的返回值返回。 词法定界意味...

C++星号的含义

[转载] [http://blog.sina.com.cn/s/blog_4a50d85b0100uk3c.html]   1、乘法运算符   2、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇...

调试lua代码

lua没有调试器,但是它提供了很强的调试功能(debug 库), 所以其实一些常用的调试功能都能很方便的使用,就像使用一个命令行调试器一样: 【例子程序】 -- debug.luagvar1 = 100 function foo() local var2 = 10 function bar()...