腾讯Bugly特约作者: 姚潮生 常见原因 1.集合类 集合类如果仅仅有添加元素的方法,而没有相应的删除机制,导致内存被占用。如果这个集合类是全局性的变量 (比如类中的静态属性,全局性的 map 等即有静态引用或 final 一直指向它),那么没有相应的删除机制,很可能导致集合所占用的内存只增不减。 2.单例模式 不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在 JVM 的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被 JVM 正常回收,导致…

2020年3月25日 0条评论 41点热度 阅读全文

普通的野指针 在C/C++中进行内存分配之后,如果在使用过之后释放了内存,一定要注意将指针置为NULL,否则指针将变成野指针。 示例代码如下 char *p = (char *)malloc(sizeof(char)); //exe task free(p);//若不释放指针p所指内存空间,则会造成内存泄漏。 p = NULL;//若不置指针p为NULL,则可能会被误以为是合法的,就会成为野指针。 //如果后续无意中引用了p就可能会造成错误 ...... // do something else 因为在通过 fre…

2020年3月22日 0条评论 32点热度 阅读全文

本文将演示如何在一个 ESP-12F 模块上实现webserver,并且可以通过web请求对与模块连接的继电器进行控制。 0.写在前面 首先,假设本文的读者了解C语言、逻辑电路和HTTP协议。再次,本文适合物联网开发者和有意向涉及物联网项目的web开发者、移动开发者阅读 。最后,如果你只需要了解实现过程,你可以继续往下看,如果你想亲自体验这神奇的过程,除了常用的一些装备和动手能力以外你还要需要准备以下材料。 ESP-12F 是基于 Espressif ESP8266芯片开发的WIFI控制模块,支持802.11 b/…

2020年3月5日 0条评论 27点热度 阅读全文

首先说明,函数的传值调用和传址调用在C和C++中都是合法的语法,但是引用调用就只是在C++中合法的。 传值调用 首先给一个广为人知的例子 #include<stdio.h> void swap(int x, int y) { int tmp = x; x = y; y = tmp; } int main(void) { int a = 1, b = 2; printf("a=%d, b=%d\n", a, b); swap(a, b); printf("a=%d, b=%d\n", a, b); ret…

2020年3月4日 0条评论 33点热度 阅读全文

最近在segmentfault上看到一个提问《c++隐式的类类型转换问题》:一时不知怎么回答,查阅相关资料后整理了本文,以供参考学习。 定义 早期的C给出的定义:左值是一个表达式,可能出现在赋值操作的左边或右边,但右值只能出现在右边。比如: a * b = 42; // 编译错误, 说明 a * b 不是左值 因为上面的定义实在太模糊,导致左值和右值很难被理解,下面给出的定义,更简单更好理解:左值(lvalue)是一个表达式,它表示一个可被标识的(变量或对象的)内存位置,并且允许使用&操作符来获取这块内存的…

2020年2月24日 0条评论 46点热度 阅读全文

“C语言简单记”基于我以前学习过程中做过的笔记、随笔,特意整理了一下,只是简单的记录了一些比较重要的知识点,不会去深入探究,面向的是一些有语言基础的人查找阅读,还请见谅,谢谢~~~ 标识符命名规范 1.只能由字母、数字、下划线_组成 2.严格区分大小写 3.不能以数字开头 4.不可以使用关键字作为标识符 注释 1.单行注释 // 进行单行注释 使用范围:任何地方都可以写注释:函数外面、里面,每一条语句后面 作用范围: 从第二个斜线到这一行末尾 快捷键:Command+/ 2.多行注释 /* */ 进行多行注释 使用…

2020年1月13日 0条评论 56点热度 阅读全文

简介 GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括…

2019年12月30日 0条评论 43点热度 阅读全文

GNU Make简介 大型项目的开发过程中,往往会划分出若干个功能模块,这样可以保证软件的易维护性。 作为项目的组成部分,各个模块不可避免的存在各种联系,如果其中某个模块发生改动,那么其他的模块需要相应的更新。如果通过手动去完成这个工作的话,对于小型的项目可能还行,但是对于比较大型的项目就几乎是不可能的。 因此Linux 系统提供了一个自动维护和生成目标程序的工具 make,它可以根据各个模块的更改情况去重新编译连接目标代码。 Make 工具的作用就是实现编译连接过程的自动化。它定义了一种语言,用来描述源文件、目标…

2019年12月30日 0条评论 28点热度 阅读全文

例程1 #include<stdio.h> int main(void) { char *s="hello"; printf("%s\n", s); s[0]="H" //因为s指针指向的字符串"hello"是字符串常量,所以不能通过指针进行更改, //所以这里会产生段错误 printf("%s\n", s); return 0; } 例程2 #include<stdio.h> #include<string.h> #include<stdlib.h> int mai…

2019年11月22日 0条评论 63点热度 阅读全文

转载自:Linux gdb调试器用法全面解析 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具,GDB主要可帮助工程师完成下面4个方面的功能: 启动程序,可以按照工程师自定义的要求随心所欲的运行程序。 让被调试的程序在工程师指定的断点处停住,断点可以是条件表达式。 当程序被停住时,可以检查此时程序中所发生的事,并追索上文。 动态地改变程序的执行环境。 不管是调试Linux内核空间的驱动还是调试用户空间的应用程序,掌握gdb的用法都是必须。而且,调试内核和调试应用程序时使用的gdb命令是完全相同的,下面…

2019年11月22日 0条评论 27点热度 阅读全文