c 内存泄漏漏是什么意思 是指源代码泄漏给用户吗 .

C语言中的内存泄漏原因及对策分析_论文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
您可以上传图片描述问题
联系电话:
请填写真实有效的信息,以便工作人员联系您,我们为您严格保密。
C语言中的内存泄漏原因及对策分析
||暂无简介
中国最大最早的专业内容网站|
总评分0.0|
该文档仅有一页,您已阅读完毕,如需下载请购买
你可能喜欢【包含:魅族 华为 小米 酷派 联想 美图 乐视 其它品牌行货报价】注:价格显示'0'的没货☆手机批发详情请回复【批发】查看具体规则★手机售后详情请回复【售后】查看具体规则☆手机零售详情请回复【零售】
酷派 手机 大神note3全网金在途 酷派 大神F2移动白在途 酷派 Y75金600 酷派 Y75白530 酷派 Y76白- 酷派 X7金800 酷派 大神note3移动白在途乐视手机乐视1 32G内
酷派 型号颜色单价全魔王 /全网/8G白540 A81-831/移动4G尊爵金1300 锋尚Mini
Y72-921移动金830 锋尚Pro2
Y91-921全网白1150 锋尚Pro
他研究了 科技 如何影响十亿人的注意力、身心健康和行为方式.Tristan Harris
最近离开谷歌,加入了一项名为 “Time Well Spent(美好时光)” 的社会活动,寻找一种新型技术,
看着这些 科技 大咖的童年照片,我们似乎找到了儿童节应该怎么过.到底是什么造就了现在的他们?儿时的他们和我们到底有什么不同?闲话少说,还是看图说话吧.【任正非:真正体会过饿的感觉】经历三年自然灾害的困
科技 引领互联网金融前进“无 科技 不金融”可谓是当下金融行业发展的写照,金融 科技 也成为了当下的行业热词.在普华永道《跨越行业界线:金融 科技 重塑金融服务新格局》报告中对金融 科技 给出的定义为
科技 革命与人类文明演进 科技 革命与人类文明演进——信息革命与生态文明系列谈(1)
按:党的十八大将“信息化”列入“新四化”,确立“信息化水平大幅提升”的战略目标;将“生态文明”列入“五位一体”总
(内容转自网络|如有涉嫌侵权,请您及时通过邮箱向本公众号进行说明,管理人员
看你是不是万州人?万州对食物的“昵称”,你都知道吗?外地人叫“辣子”、“秦翘””辣椒“咱万州人管它叫“海椒”
科技 创造美好生活无 科 技 , 不 武 汉【任正非:真正体会过饿的感觉】经历三年自然灾害的困难时期,家中七个孩子,任正非是老大.每餐实行严格分饭制,控制所有人欲望的配给制,保证人人都能活下来.高三快Android 开发进阶之『清除应用中的内存泄漏』 - 简书
下载简书移动应用
写了9125字,被5人关注,获得了10个喜欢
Android 开发进阶之『清除应用中的内存泄漏』
Android 内存管理机制
Android 的内存管理机制可以简单概括为:系统没有为内存提供交换区,它使用
来管理内存。
对开发来说,上面的管理机制意味着:
彻底释放内存资源的唯一方法是释放对象的引用,使对象可以被 GC(garbage collector) 回收。
有一种例外情况:没有任何修改的文件,比如代码本身,映射进内存后,如果系统需要使用这部分内存,会将这部分内存页移出。
什么是内存泄漏
上面第 2 点在开发应用时,并没有实际意义。因此在开发应用时,正确使用内存先要保证释放掉不需要的内存资源。如果对象不需要了,但是由于没有释放对它的引用, GC 无法回收相应的内存资源,这部分内存就无法被利用了。这种情况就是所谓的“内存泄漏”。
内存泄漏是资源泄漏的一种,是由于没有正确管理内存分配而造成内存不再使用却没有得到释放。
Memory Leaks
内存泄漏就是对内存资源的浪费,内存通常是珍稀资源。所以,内存泄漏的影响很坏!
如果应用存在内存泄漏,对用户来说,应用会越用越慢,并且会出现闪退;对开发者而言,会收到很多应用不稳定的评价,大量内存溢出( OOM )的错误日志,紧接着就是产品,测试,领导甚至老板的围攻。
苦逼的“程序员”
如何清除内存泄漏
前面提到,如果存在内存泄漏,并且每次泄漏的内存很多,则应用在使用过程中会时不时出现闪退的现象。如果查看日志数据,会看到OutOfMemoryError类型的错误:
OutOfMemoryError
如果每次溢出的内存不多,则应用偶尔会出现闪退的现象,甚至平常不会出现闪退现象。但统计系统也会存在一些 OutOfMemoryError 类型的错误。
这里需要提醒的是:OutOfMemoryError 错误打印的栈信息中出错的位置很有可能不是问题的原因。因为由于泄漏导致内存不够时,任何位置都可能引起 OutOfMemoryError 错误。所以不要过分关注引起 OutOfMemoryError 的位置。
试着找到导致泄漏的操作路径,拼命重复这个操作路径!
这里需要提醒的是:
不是任意一台设备都可以复现所有泄漏,使用同款设备尝试。
要记录测试数据供后续分析:测试前记录下应用所占用的内存大小 m0 ,重复多次后再记录下应用所占用的内存大小 m1 以及重复次数 n ;出现 OOM 时,或者将要出现 OOM 时抓取应用的 heap dump 数据( .hprof 文件)。
如果每次泄漏的内存很少,重复次数 n 就需要很大,此时可以借助 monkey 测试脚本来完成。
如果上面的 m1 明显大于 m0 或者直接出现 OOM 错误,则应用一定存在内存泄漏。
确认存在内存泄漏后,接下来就要定位哪些对象被泄漏了。目前比较好用的是
这个工具。MAT 是一个 Java heap analyzer ,用来查找内存泄漏与优化内存。
在一个时间点,给一个 Java 进程的内存使用情况拍个照,就是一份 Heap Dump 数据。通常 heap dump 包含了快照触发时, Java 虚拟机堆 java 对象和类的相关信息,如:
All ObjectsClass, fields, primitive values and references
All ClassesClassloader, name, super class, static fields
GC RootsObjects defined to be reachable by the JVM
Thread Stacks and Local VariablesThe call-stacks of threads at the moment of the snapshot, and per-frame information about local objects
需要注意的是:heap dump 数据并不包含对象分配信息,所以无法从中获知谁创建了对象,在哪里创建的对象。
Shallow vs. Retained Heap
Shallow heap 是一个对象实际占用的内存大小。Retained set of X 指的是这样的对象集合: X 对象被 GC 回收后,所有能被回收的对象集合。Retained heap of X 指的是 retained set 中所有对象 shallow heap 的总和。
换一种说法: shallow heap 是一个对象在堆中占用的大小,retained heap 是对象被 GC 回收后,能释放的堆大小。
Dominator Tree
dominator tree 是 MAT 提供的一种对象图。将对象的引用关系图转成 dominator tree 可以使我们容易看清堆中内存的分布以及相关依赖。
下面是一些定义:
对象 x dominates 对象 y 则在对象图中每一条从起点(或者根节点)到对象 y 的路径必须经过对象 x 。
对象 y 的 immediate dominator x 是距离 y 最近的那个 dominator 。
dominator tree 基于对象图构建。在 dominator tree 中,每一个对象都是其子对象的 immediate dominator 。因此,对象与对象之间的依赖关系很容易被识别。
dominator tree 有以下几点重要特征:
对象 x 的子树中的对象集合就是 x 的 retained set 。
如果对象 x 是 对象 y 的 immediate dominator ,则 x 的 immediate dominator 也 dominates y ,以此类推。
The edges in the dominator tree do not directly correspond to object references from the object graph.
根据上面的概念,下图左边的 object graph 可以转换为右边的 dominator tree :
object graph to dominator tree
Garbage Collection Roots
GC root 是 heap 外面那个可以访问的对象。下面是可能的 GC root :
System ClassClass loaded by bootstrap/system class loader. For example, everything from the rt.jar like java.util.* .
JNI LocalLocal variable in native code, such as user defined JNI code or JVM internal code.
JNI GlobalGlobal variable in native code, such as user defined JNI code or JVM internal code.
Thread BlockObject referred to from a currently active thread block.
ThreadA started, but not stopped, thread.
Busy MonitorEverything that has called wait() or notify() or that is synchronized. For example, by calling synchronized(Object) or by entering a synchronized method. Static method means class, non-static method means object.
Java LocalLocal variable. For example, input parameters or locally created objects of methods that are still in the stack of a thread.
Native StackIn or out parameters in native code, such as user defined JNI code or JVM internal code. This is often the case as many methods have native parts and the objects handled as method parameters become GC roots. For example, parameters used for file/network I/O methods or reflection.
FinalizableAn object which is in a queue awaiting its finalizer to be run.
UnfinalizedAn object which has a finalize method, but has not been finalized and is not yet on the finalizer queue.
UnreachableAn object which is unreachable from any other root, but has been marked as a root by MAT to retain objects which otherwise would not be included in the analysis.
Java Stack FrameA Java stack frame, holding local variables. Only generated when the dump is parsed with the preference set to treat Java stack frames as objects.
UnknownAn object of unknown root type. Some dumps, such as IBM Portable Heap Dump files, do not have root information. For these dumps the MAT parser marks objects which are have no inbound references or are unreachable from any other root as roots of this type. This ensures that MAT retains all the objects in the dump.
寻找被泄漏对象(病灶)
MAT 的功能很多很强大,用来分析内存泄漏的话,主要使用 Dominator Tree 与 Histogram 这两个功能。
MAT 相关功能简介
使用 MAT 打开前面拿到的 hprof 文件:
MAT_Overview.png
首先看到的是 Overview 页面。里面 Details 部分显示了堆的一些基本信息,以及 Unreachable Objects Histogram 入口,其中列出了堆中所有 Unreferenced 对象。
在 Actions 部分,有Histogram 和 Dominator Tree 的入口,前者更关注堆中对象的个数,后者更关注堆中对象的类型。其中列出的对象都是 Referenced 对象。被泄漏的对象一定是从里面找。
寻找被泄漏对象,可以从两个方向下手:
方式一、从对象个数入手
如果前面的重复次数 n 已知的话,可以先从对象个数入手。重复一次泄漏路径,就会泄漏一次对象,所以重复 n 次,泄漏的对象个数应该为 n 个。
打开 Histogram :
Histogram 页面是一张表,表里的每一行是一个 java 类。第一列是类名,第二列是该类实例的个数,第三列是该类所有实例的 shallow heap ,第四列是该类所有实例的 retained heap 。
表的第一行可以输入相应字段的条件过滤要显示的结果,如排查应用层的泄漏,可以通过提供类名的关键词过滤,使之只显示相关类的信息。
前面重复次数 n 为 9 。排查对象个数为 9 附近的类,
Objects leaked shown in histogram
不难发现 HomeTabActivity 这个类依然在 heap 中(App 此时已经不在前台,且已经强制 GC)。因此,可以确认 HomeTabActivity 对象被泄漏了。
方式二、从对象类型开始
如果重复次数 n 不确定,则可以从 Dominator Tree 开始查。通过 Dominator Tree ,我们可以很方便的看到有哪些无法被 GC 回收的内存块儿,以及对应内存块儿的 GC root 。因此,我们可以通过排查并确认内存块儿以及相应 GC root 是否合理来判断此内存块儿中的对象是否是被泄漏的对象。
打开 Dominator Tree :
Dominator Tree
Dominator Tree 页面也是一张表,表里的每一行是一个对象,第一列显示了该对象的类名以及内存地址等,第二列显示了该对象的 shallow heap ,第三列显示了该对象的 retained heap ,第四列显示了该对象的占比。
与 Histogram 类似,可以通过过滤缩小排查范围,基于前面的分析,这次我们用更小的范围排查。
需要注意,在 Class Name 这一列中,靠左边一排图标中,有些图标左下角有小圆点,有些没有。带小圆点的对象就是前面提到的 GC root 。最右边的字段,如: System Class 是 GC root 的类型。GC root 本身不会是泄漏的对象。
只需要排查不是 GC root 的那些对象。不难发现 heap 中存在 9 个 HomeTabActivity 类型的对象,与当时应用已经不在前台的事实有出入,所以,这 9 个对象不应该存在,是被泄漏的,同时与之前重复次数 n 一致。
MAT_dt_leaked.png
修复泄漏(治病)
找到被泄漏的对象后,接着要算出从该对象到 GC roots 的最短强引用路径,找到本不该存在的路径,对照相应源码,修复掉错误的代码逻辑,也就剔除了这个内存泄漏。
在 MAT 中如何看到一个对象到 GC root 的最短强引用路径呢?
在 Histogram 中查看
Show shortest paths to GC roots exclude weak references
在被泄漏类上面,点击右键菜单中的 Merge Shartest Paths to GC Roots --& exclude weak references 。就会看到这个 java 类中所有无法被释放的对象的 GC roots ,点开每条路径,可以看到引用关系。
Paths to GC roots with detail infomation
从上图,可以看到被泄漏的 HomeTabActivity 对象都是同一个 GC root 。
在 Dominator Tree 中查看
在被泄漏对象上面,通过右键菜单,选择 Path to GC Roots --& exclude weak references 可以看到该对象到 GC root 的一条路径。
MAT_dominator_tree_root.png
与通过 Dominator Tree 找到的路径一致。
Paths to GC roots with detail infomation
前面说这条路径是不应该存在的,但是是什么原因导致其出现呢?接下来我们分析泄漏原因。
MAT_dt_gc_root.png
我们看到位于地址 0x4068aca8 的一个 HomeTabActivity 对象被位于地址 0x409cbbc8 的一个 Toast 对象通过成员变量 mContext 引用。接着,mContext 又被 Toast 中的内部类 TN 对象所引用,这个对象又是一个 Native Stack 类型的 GC root 。
根据上面的引用路径,结合应用相关源码:
HomeTabActivity 源代码(部分);
/* HomeTabActivity.java */
public class HomeTabActivity extentds ... {
public void onBackPressed() {
if ((currentTime - touchTime) &= waitTime) {
Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();
发现在连按两次返回键退出应用的功能代码中,将 HomeTabActivity 对象的引用传入 Toast.makeText() 。
因此泄漏的原因是:HomeTabActivity 对象被生命周期更长的 Toast$TN 对象所引用,导致其实际生命周期超出了所预期的生命周期。
其实,站在 coder 的角度,内存泄漏本质就是该死不死,不论是什么具体形式导致了这种局面。
本例中的泄漏是由于使用了不恰当的 Context 对象所致。
Android 中存在 Application Context 与 Activity Context 两种具体的 Context 实例。前者的生命周期与应用进程的生命周期一样,比后者长。
因此,在使用 Toast 时,应该使用 Application Context ,就不会出现该死不死的对象,也就不存在内存泄漏。修复代码如下:
public class HomeTabActivity extentds ... {
public void onBackPressed() {
if ((currentTime - touchTime) &= waitTime) {
Toast.makeText(getApplicationContext(), "再按一次退出应用", Toast.LENGTH_SHORT).show();
Android 常见内存泄漏形式
Activity 泄漏 - 内部类
Activity 泄漏 - 容器对象泄漏
容器对象泄漏
Activity 泄漏 - Static, Singleton
Static, Singleton
谨慎选择合适的 Context
合适的 Context
注意有生命周期对象的注销
有生命周期对象的注销
注意大胖子(Bitmap, WebView, Cursor)的及时回收
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:自由、创新、研究、探索
Linux/Windows Mono/DotNet [ Open Source .NET Development/ 使用开源工具进行DotNet软件开发]锐意进取,志存高远.成就梦想,只争朝夕.从你开始,创新世界.【That I exist is a perpetual supprise which is life. Focus on eCommerce】
最近在看Dictionary的源代码的时候, 突然想到Dictionary的不当使用中有一种隐含内存泄漏的可能.
简化使用场景
&&&&& 小A正在写一个简单的图书销售系统.
&&&&& 他首先需要处理的是订单和订单里面对应的书目集合. 接着他发现自己需要一个特定的内存结构, 来临时保存所有的订单及其伴随的销售书目集合, 以减小对数据库的压力. 小A想到了词典Dictionary这个保存关联数据最好用的结构 - 将订单Order对象做为键, 将对应的销售书目Books作为值, 保存在词典中.
&&&&& 订单中包含订单ID/订货人ID/订货时间. 小A知道, 要想将Order对象作为键, 他必须重写Order类的GetHashCode()方法和Equals()方法, 使这两个函数有意义而不是接受系统默认的实现, 这是Dictionary所要求的. 这个功能实现示意如下:
Order Class
&internal&class&Order
&&&&&public&int&ID&{&& }
&&&&&public&int&PatronID&{&& }
&&&&&public&DateTime&BoughtTime&{&& }
&&&&&// ...
&&&&&public&override&bool&Equals(object&obj)
&&&&&&&&&if&(obj&==&null)
&&&&&&&&&&&&&return&
&&&&&&&&&Order&orderToCompare&=&obj&as&O
&&&&&&&&&if&(orderToCompare&==&null)
&&&&&&&&&&&&&return&
&&&&&&&&&return&ID&==&orderToCompare.ID&&&
&&&&&&&&&&&&&PatronID&==&orderToCompare.PatronID&&&
&&&&&&&&&&&&&BoughtTime&==&orderToCompare.BoughtT
&&&&&public&override&int&GetHashCode()
&&&&&&&&&return&("ID"&+&ID.ToString()&+
&&&&&&&&&&&&&"PatronID"&+&PatronID.ToString()&+
&&&&&&&&&&&&&"TimeStamp"&+&BoughtTime.ToString())
&&&&&&&&&&&&&.GetHashCode();
&&&&& 后来他发现,对于已经存在的有些订单如果存在用户更改了购买的书籍等操作, 这些订单需要更新, 在更新后需要更新订单的时间戳:
Update Order Property
&public&void&UpdateOrderTime(Order&order)
&&&&&order.BoughtTime&=&DateTime.N
&&&&& 这个简单的系统写完后刚送去质量部门刚测试了两天, 老板就把小A叫到眼前狠狠剋了一顿, "Memory Leak!"
问题出在哪里呢?
&&&&& 问题出在了作为Dictionary键的Order对象身上.
&&&&& Dictionary的.NET实现有一个隐含的特性比较容易让人忽略, 那就是它对于存储数据的定位方式. Dictionary是通过对键的哈希值进行散列计算, 从而确定其对应的值存放的位置. 而Dictionary内部的添加/删除/修改操作, 都完全地依赖于这一定位方式. 这个定位方式, 在Dictionary源代码中体现为FindEntry()操作:
&&&&&&&&&private&int&FindEntry(TKey&key) {
&&&&&&&&&&&&&if(&key&==&null) {
&&&&&&&&&&&&&&&&&ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
&&&&&&&&&&&&}
&&&&&&&&&&&&&if&(buckets&!=&null) {
&&&&&&&&&&&&&&&&int&hashCode&=&comparer.GetHashCode(key)&&&0x7FFFFFFF;
&&&&&&&&&&&&&&&&for&(int&i&=&buckets[hashCode&%&buckets.Length];&i&&=&0;&i&=&entries[i].next) {
&&&&&&&&&&&&&&&&&&&&if&(entries[i].hashCode&==&hashCode&&&&comparer.Equals(entries[i].key,&key))&return&i;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&return&-1;
&&&&& 当某一个order的BoughtTime属性改变时, 对应的order的哈希值也改变了, 这时伴随该order的书目列表还在Dictionary中,但是FindEntry()操作却没法再定位到它. 这个书目列表将一直存在在Dictionary当中,直到这个Dictionary的生命周期结束. 这就是隐含的内存泄漏. 如果这是个WinForm程序, 或许影响还不是很大. 但是如果出于一个要求高在线率的网络服务当中时, 内存使用Overflow的异常将肯定是不可避免的.
&&&&& 在这个简单场景中体现出来的内存泄漏, 在更为复杂的场景下, 可能会更隐蔽也更难发现.虽然基本的道理是一样的,但是在更复杂的业务逻辑中, 我们可能更容易忽略它的危害.
&&&&& 如果一个业务对象在业务逻辑中可能会被修改, 千万不要将它作为Dictionary的键!!! 使用对象作为Dictionary的键时, 要慎重的考虑这个对象会不会在其余的地方有隐式或者显式地被改变的可能.
&&&&& 恰当的使用Dictionary.
作者:出处:
阅读(...) 评论()
随笔 - 14359
评论 - 950C语言中的内存泄漏原因及对策分析--《中国新通信》2015年05期
C语言中的内存泄漏原因及对策分析
【摘要】:正在C语言程序设计中,内存泄漏几乎是很难避免的,C程序产生泄漏内存,则运行速度会逐渐变慢,并最终停止运行;如果产生覆盖内存,程序会变得非常脆弱,很容易受到恶意用户的攻击。内存泄漏是一种隐性危害,它们很难被发现,通常不能在相应的源代码中找到错误,需要仔细分析与专门的检测工具才能发现。一、内存泄漏的定义通常我们所说的内存泄漏,是指分配出去的内存在使用之后没有释放掉,没有回收,长此以往,会造成没有足够的
【作者单位】:
【关键词】:
【分类号】:TP312.1【正文快照】:
在C语言程序设计中,内存泄漏几乎是很难避免的,C各种未知的错误。所以,必须使用free()函数释放内存,程序产生泄漏内存,则运行速度会逐渐变慢,并最终停止运参数是内存地址(指针),例如:free(p Number),依上例。行;如果产生覆盖内存,程序会变得非常脆弱,很容易受到三、内存泄漏避
欢迎:、、)
支持CAJ、PDF文件格式,仅支持PDF格式
【参考文献】
中国期刊全文数据库
吕维梅,刘坚;[J];计算机工程与应用;2005年05期
【共引文献】
中国期刊全文数据库
王祥瑞;;[J];长春大学学报;2009年06期
艾大清;祝烈煌;;[J];警察技术;2008年04期
杨善红;;[J];民营科技;2012年09期
王雅丽;李建良;;[J];计算机与现代化;2013年05期
张鹏;杨秋辉;李海怒;;[J];计算机工程与应用;2013年14期
姚明海;王娜;赵连朋;;[J];计算机工程与应用;2013年14期
王文龙;;[J];喀什师范学院学报;2013年06期
李灿辉;;[J];长沙民政职业技术学院学报;2007年03期
张天良;;[J];中国西部科技;2008年35期
滕轶?;;[J];信息与电脑(理论版);2010年04期
中国博士学位论文全文数据库
张永铮;[D];哈尔滨工业大学;2006年
中国硕士学位论文全文数据库
李志军;[D];西安电子科技大学;2010年
周高嵚;[D];北京化工大学;2005年
柳崧轶;[D];吉林大学;2007年
饶坤;[D];北京化工大学;2012年
崔海全;[D];太原科技大学;2012年
王雅丽;[D];西北农林科技大学;2013年
叶亮;[D];华中科技大学;2013年
【相似文献】
中国期刊全文数据库
M[J];电脑编程技巧与维护;2000年07期
夏斌强;;[J];程序员;2003年10期
钟灵,邹兆佳,冯大春;[J];计算机时代;2005年05期
吴民,涂奉生;[J];计算机工程与应用;2005年14期
林丽芬;;[J];福建教育学院学报;2007年07期
徐红梅;刘亭利;;[J];福建电脑;2010年06期
朴艳丽;张楠;;[J];中国传媒科技;2012年24期
胡燕;龚育昌;孙伟峰;赵振西;;[J];小型微型计算机系统;2008年10期
段飞鹏;朱怡安;黄姝娟;赵聪;;[J];计算机与现代化;2014年03期
王泽民,芦东昕,徐立峰,王陈;[J];计算机工程;2005年13期
中国重要会议论文全文数据库
张威;薛廷梅;卢庆龄;;[A];第十届全国容错计算学术会议论文集[C];2003年
张威;李辉;毕学军;宫云战;;[A];第四届中国测试学术会议论文集[C];2006年
中国重要报纸全文数据库
中国人民大学信息学院
孟泽;[N];中国计算机报;2008年
信息产业部数据所多媒体室
廖铮;[N];计算机世界;2000年
中国硕士学位论文全文数据库
柯平;[D];北京邮电大学;2009年
王皓;[D];北京交通大学;2008年
齐华军;[D];天津工业大学;2006年
王喆;[D];大连理工大学;2012年
舒菊芳;[D];华中科技大学;2009年
&快捷付款方式
&订购知网充值卡
400-819-9993
《中国学术期刊(光盘版)》电子杂志社有限公司
同方知网数字出版技术股份有限公司
地址:北京清华大学 84-48信箱 知识超市公司
出版物经营许可证 新出发京批字第直0595号
订购热线:400-819-82499
服务热线:010--
在线咨询:
传真:010-
京公网安备75号

我要回帖

更多关于 内存泄漏和内存溢出 的文章

 

随机推荐