内存泄漏:  动态申请内存,没有正常释放,后续又申请内存,也没释放内存,导致内存池被全部被占用,最终再申请内存的时候失败;严格点则每次申请内存的时候判断申请到的指针是否为空,若为空NULL则表示申请失败。程序正常运行的时候,隔断时间查看内存使用率,如果在没有任何操作的情况下内存使用率在不停增加,则很可能就是动态申请的内存没有释放。

内存分配未成功,却使用了它。

  编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行

  检查。如果是用malloc或new来申请内存,应该用if(p==NULL) 或if(p!=NULL)进行防错处理。

C内存管理(详细): 
http://blog.csdn.net/maybe3is3u5/article/details/52067150
 
http://espressif.com/zh-hans/support/explore/faq?keys=
如何优化 ESP8266 应用的内存使用?

通过以下四种方法可以优化 ESP8266 应用的内存使用,减少应用的内存占用空间。

1. 将字符串放到 Flash 中:

(1) 有些字符串可以放在 Flash 中,特别是长字符串,例如 HTML 请求和响应模板。

比如,一个字符串原来是用 define 定义的:

#define test_string    "hello world”

现在可以定义成如下:

static const char test_string[] ICACHE_RODATA_ATTR = "hello world";

(2) 当用 ICACHE_RODATA_ATTR 定义字符串常量时,需要对数据内容进行四字节对齐读取。由于 Flash 中的数据需要四字节对其读取,所以定义一个宏获取对齐后的字符串长度:

#define GET_ALIGN_STRING_LEN(str)    ((strlen(str) + 3) & ~3)

使用字符串时,动态分配一个新的数组对象,读写 Flash 中的数据。然后用 os_memcpy API 来复制数据内容:

unsigned int str_len = GET_ALIGN_STRING_LEN(test_string);

char *tmp_string = (char *)os_malloc(str_len);

os_memcpy(tmp_string, test_string, str_len);

(3) 在用户的应用代码里使用 tmp_string 进行操作,而不使用 test_string。此方法除了减少应用的 RAM 占用空间,也能解决由于对 Flash 中的数据进行非对齐读取时,在应用中引起的 exception。

…….

(4) 当用户代码中,无需再使用通过以上方法读取的数据,需要释放之前分配的内存空间

os_free(tmp_string);

注意:如果不释放之前分配的内存空间,重复分配内存将会减少核心功能所需的内存,导致 API 出现功能异常或失败。

2. 把 const 数据放到 Flash:

(1) uint32 类型的数组可以直接放到 Flash,比如:

const uint32 array[4] ICACHE_RODATA_ATTR = {0x11111111, 0x22222222, 0x33333333, 0x44444444};

可以直接使用 array[0]。

(2) 对于 uint8 和 uint16 类型的数组,要注意读取数据的时候要四字节对齐,

比如:

const uint8 array[7] ICACHE_RODATA_ATTR = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};

(3) 如果需要按字节读取 char 数组当中的元素,可从软件上进行处理,先按四字节读取,然后再按偏移取当中的一个字节。如果直接读取 array[0],会导致 crash。

(4) 对于数据结构,通常做法是分配比用户需要读取的结构更大的内存,从 Flash 四字节读取数据到内存。如同方法 1,在代码中依然使用对象指针。修改代码操作内存中的数据结构,而不是读取数组。

3. 将调试字符串放到 Flash 中:

现在默认的 printf 打印的字符串都还是放在 RAM 区,占用部分内存。如果用户无需频繁打印日志文件,或者调试字符串太长,可以使用优化的 os_printf 把打印的字符串放到 Flash 而不是 RAM 中。

4. 避免使用全局数组变量:

全局数组变量会在应用的整个生存期中占用不必要的内存。为减少全局数组变量的使用,乐鑫提供了动态内存分配 API。在基于事件的编程中,请使用 os_malloc 和 os_free 来动态分配所需的内存空间。但注意,我们不建议过于频繁地分配和释放大小不等的内存空间。

优化内存_内存泄漏——C的更多相关文章

  1. 性能优化 Profiler MAT 内存泄漏 堆转储 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  2. 如何优化cocos2d/x内存使用和程序大小的程序

    从最初的:http://www.himigame.com/iphone-cocos2d/1043.html 译者: 在我完毕第一个游戏项目的时候.我深切地意识到"使用cocos2d来制作游戏 ...

  3. 优化Android应用内存的若干方法

    原帖地址:http://www.open-open.com/lib/view/open1392013992317.html 在app开发的各个阶段中要考虑RAM的限制问题, 包括在设计阶段(正式开发之 ...

  4. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  5. 【腾讯优测干货分享】如何降低App的待机内存(五)——优化dex相关内存及本章总结

    本文来自于腾讯优测公众号(wxutest),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/01Abwe0p1h3WLh28Tzg_Dw 1.5案例:优化dex相 ...

  6. 检测Windows程序的内存和资源泄漏之原生语言环境

    最近接连收到大客户的反馈,我们开发的一个软件,姑且称之为App-E吧,在项目规模特别大的情况下,长时间使用会逐渐耗尽内存,运行越来越缓慢,软件最终崩溃.由于App-E是使用混合语言开发的,主界面使用C ...

  7. 内存溢出,内存泄漏,CPU溢出区别

    内存溢出 out of memory,就是你要的内存空间超过了系统实际分配给你的空间,此时系统相当于没法满足你的需求,就会报内存溢出的错误 内存泄漏是指你向系统申请分配内存进行使用(new),可是使用 ...

  8. Unity游戏Mono内存管理及泄漏

    UWA工具 https://yq.aliyun.com/articles/435553 Unity游戏Mono内存管理及泄漏 https://wetest.qq.com/lab/view/135.ht ...

  9. 32位汇编基础_内存_每个应用进程都会有自己独立的4GB内存空间

    1.每个应用进程都会有自己独立的4GB内存空间 这句话很多人听起来可能会很矛盾很不解. 例如,我的电脑只有2GB的内存,打开个软件机会占用4GB内存,而我的电脑内存只有2GB,显然不够用,但是为什么程 ...

随机推荐

  1. C#基础知识之父子类,实例、静态成员变量,构造函数的执行顺序(经典示例)

    父子类.示例.静态成员变量.构造函数的概念的基础理解完全可以利用下面的示例诠释,非常经典,直接上代码: public class ShowInfo { public ShowInfo(string i ...

  2. u-boot 用哪个lds链接脚本

    顶层Makefile文件中 : ifndef LDSCRIPT    #LDSCRIPT := $(srctree)/board/$(BOARDDIR)/u-boot.lds.debug    ifd ...

  3. redis 五大类型 、持久化方式以及主从(哨兵模式)

    一.redis 五大类型: redis 键 keys * exists key的名字,判断某个key 是否存在 move key db 当前数据库就没有了,被移除了 ttl key 查看还有多少秒过期 ...

  4. spring动态调用方法

    有的时候为了程序的灵活性,需要根据参数动态的调用方法.代码框架大致spring为主,下面是具体代码: 接口: 实现类(实现类中有一个从spring容器中取的对象) 这是最初我直接用反射去调用的代码: ...

  5. hash详细介绍

    转发http://www.cnblogs.com/maybe2030/p/4719267.html (请转步这个网站,写得非常好)

  6. 【leetcode】1123. Lowest Common Ancestor of Deepest Leaves

    题目如下: Given a rooted binary tree, return the lowest common ancestor of its deepest leaves. Recall th ...

  7. Spring 自动代理

    在传统的基于代理类的AOP实现中,每个代理都是通过ProxyFactoryBean织入切面代理,在实际开发中,非常多的Bean每个都配置ProxyFactoryBean开发维护量巨大.解决方案:自动创 ...

  8. linux运维、架构之路-MySQL备份与恢复(四)

    一.备份方式 ①逻辑备份(文件表示:SQL语句) ②物理备份(数据文件的二进制副本) ③基于快照的备份 ④基于复制的备份 二.备份工具 ①mysqldump:原生自带的逻辑备份工具 ②mysqlbin ...

  9. jquery-时间轴滑动

    效果预览图: html: <div class="tim"> <div class="timdiv"> <div class=&q ...

  10. 关联规则挖掘--Eclat算法