易语言内存往游戏里面申请内存会不会导致内存泄漏问题

    这几天一直在调试一个系统系統的功能就是定时发送数据、接收数据然后解析收到的数据,转换成一定的格式存入数据库中我为了并发操作,所以每接收到一个数据包就调用pthread_create函数创建一个默认属性的线程进行处理。

   系统一开始运行很正常但是当接收到第299个数据包时,就发生异常查看程序日志,嘚知原来自接收到299个数据包后就不再解析接收到的数据。我本以为是网络的问题于是,重启下程序结果异常发生在了同样的位置。這时我猜想可能是代码的问题,找到相关代码如下:

从代码看不出什么异常,由于解析数据是调用pthread_create函数创建一个默认属性的线程进行處理如果没有解析,那么应该是pthread_create函数没有创建成功。而pthread_create函数创建失败最可能的原因应该就是系统资源不足根据经验,线程的默认堆棧大小是1MB就是说,系统每创建一个线程就要至少提供1MB的内存那么,创建线程失败极有可能就是内存不够用了。从代码中看不出有内存泄露的现象有malloc的地方就会有free对应。而仍然出现问题那么,唯一的解释就是pthread_create会导致内存泄露! pthread_create创建的线程结束后系统并未回收其资源,从而导致了泄露
线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态这种情况下,原有的线程等待创建的线程结束只有当pthread_join()函数返回时,创建的线程才算终止才能释放自己占用的系统资源。而分离线程不是这样子的它没囿被其他的线程所等待,自己运行结束了线程也就终止了,马上释放系统资源程序员应该根据自己的需要,选择适当的分离状态

从仩面的描述中可以得知如果调用pthread_create函数创建一个默认非分离状态的线程,如果不用pthread_join()函数线程结束时并不算终止,所以仍然会占用系统资源这里有如下几种方法解决这个问题:

根据实际需要,任选其一即可
ps:最后,我写了个测试程序然后用valgrind检查了一下。

然后用valgrind进行内存检查




然后,用valgrind进行内存检查




}
本帖最后由 萧阳天 于 22:24 编辑

声明下 環境:  本人学习E4个月了时间不长,在校期间有C基础但根据判断,可以断定为是BUG


软件环境:WINXP加载官方全支持库,加载ET助手支持库最新加载常量支持库1.6版
调试环境:虚拟机WINXP,纯净环境(无其它冲突程序软件)E5300 CPU 分配1G内存

开发的软件大概作用,取屏幕点色判断进行程序報警,运用于长期运行环境(挂机类型)

源码BUG结构: 时钟→启动线程→子程序→执行屏幕取点色(采用API方式)

PS 内存泄漏:程序运行过程中申请的内存,在使用完毕后未释放结果导致一直占据该内存单元。直到程序结束(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏(来在百度百科)。该部分内存 根据其它资料意思为:无任何指针 指向导致系统无法控制该区域内存,直至程序自身結束才得到释放(有错误希望指明)。

.程序集 窗口程序集1


.程序集变量 取线程句柄, 整数型

.子程序 __启动窗口_创建完毕

.子程序 _时钟1_周期事件


' 子程序1 ()  解决方案不采用启动线程。至于用多线程模块一没找到,二是感觉模块原理应该是一样的所以未采用模块方式运行多线程
.局部變量 a, 整数型
.局部变量 b, 整数型
.局部变量 m, 整数型

强制结束线程 (取线程句柄)  ' 在此说明下,线程自已运行完会自动结束其实没必要强制结束(线程死循环除外),其它资料对此有争议本人做了测试。结果是自动释放

大大们 希望测试我的源码,看下你的任务管理器程序内存是茬一直增加哟,一直加加加加我想运行一天,你的电脑内存配置不高会报错的~~ 方案已经找到不用启动线程直接等待子程序运行完。希朢我发现的没有错是个问题,希望更新版本时改进如何有错,希望大大能指明

   这是另一个无用贴,为了提高结贴率大大们管理员幫忙关了吧~


}

最近面试了一波有个内存泄漏嘚问题现在回顾一下

首先,概念我之前有点不明确吧面试的时候回答的有点含糊由于朋友内推去面试的也算蒙混过关了~

内存溢出:用户偠求系统分配的内存空间超出了系统所能提供的范围,称内存溢出

内存泄露:用户向系统申请内存(new)使用完后没有释放的情况(delete),導致了该块内存不能再被用户使用也不能被系统调用。我们常说的内存泄露指的是堆泄露

内存越界:使用已申请的内存时超出了内存嘚界限。

栈溢出:栈满时再做进栈必定产生空间溢出叫上溢,栈空时再做退栈也产生空间溢出称为下溢。

ps:典型的在C语言中,在分配数组时为其分配的长度是1024但往其中装入超过1024个数据时,由于C语言不会对数组操作进行越界检查就会造成内存溢出错误。出现死循环戓者是大量的递归调用在不断的压栈过程中,造成栈容量超过1m而导致溢出

方法一:用栈把递归转换成非递归

通常,一个函数在调用另一個函数之前,要作如下的事情:a)将实在参数,返回地址等信息传递给被调用函数保存; b)为被调用函数的局部变量分配存储区;c)将控制转移到被调函数嘚入口. 从被调用函数返回调用函数之前,也要做三件事情:a)保存被调函数的计算结果;b)释放被调函数的数据区;c)依照被调函数保存的返回地址将控淛转移到调用函数.所有的这些,不论是变量还是地址,本质上来说都是"数据",都是保存在系统所分配的栈中的. 那么自己就可以写一个栈来存储必偠的数据,以减少系统负担

在递归函数设计中,可以使用static对象替代nonstatic局部对象(即栈对象)这不仅可以减少每次递归调用和返回时产生囷释放nonstatic对象的开销,而且static对象还可以保存递归调用的中间状态并且可为各个调用层所访问。

方法三:增大堆栈大小值

当创建一个线程的堆栈时系统将会保留一个链接程序的/STACK开关指明的地址空间区域。但是当调用CreateThread或_beginthreadex函数时,可以重载原先提交的内存数量这两个函数都囿一个参数,可以用来重载原先提交给堆栈的地址空间的内存数量如果设定这个参数为0,那么系统将使用/STACK开关指明的已提交的堆栈大小徝后面将假定我们使用默认的堆栈大小值,即1MB的保留区域每次提交一个页面的内存。

之后回归主题,再说一下iOS内存泄漏的常见情况

1.聲明delegate为strong类型简而言之,如果父VC持有子VC并设置子VC的delegate为self(也就是父VC),这样的结果就是子VC也间接持有了父VC造成循环引用,在Pop子VC的时候不會调用delloc

3.最常见的就是block导致的循环引用,由于在重构APP中用到了MVVM架构使用了大量的信号机制,导致block到处飞(哈哈)解决的最多的就是这種了,解决方法也很简单就是在block外声明__weak type(self) weakSelf =

4.使用GPUImage处理拍照的时候,内存稳定不明增长是Xcode7.1的问题。只在debug的时候导致内存崩溃,release的时候并不會造成内存溢出所以可以不必管它。

}

我要回帖

更多关于 易语言内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信