1,堆内存与栈内存得区别?
堆内存是由程序员手动管理的一段内存,使用相对复杂,但内存足够大。栈内存是存放局部变量 和块变量由操作系统管理的一段内存,会在程序运行过程中自动申请、释放内存,使用简单,但 是内存小。由于栈内存由操作系统自动分配,那么一般只会出现内存越界,但堆内存由程序员操 作,则会出现内存泄漏,内存碎片,内存越界等一系列安全隐患
2,使用堆内存越界的后果?
内存越界使用,这样的错误引起的问题存在极大的不确定性,有时大,有时小,有时可能不会对 程序的运行产生影响,正是这种不易重现的错误,才是最致命的,一旦出错破坏性极大 1,破坏了堆中的内存维护信息,特别是动态分配的内存块的维护信息,因为操作系统在分配和释 放内存块时需要访问该数据信息,一旦该数据被破坏,就会影响之后对内存的申请、释放。 2,破坏了程序自己的其他对象的内存空间,这种破坏会影响程序执行的不正确性,产生段错误 3,破坏了空闲内存块,很幸运,这样不会产生什么问题,但谁知道什么时候不幸会降临
3,什么是内存泄漏?如何定位内存泄漏?
由于业务逻辑出错或者粗心大意导致使用完毕的堆内存没有正常释放,当再次需要时又重新申请,
又没有释放长时间积累下导致可用的内存越来越少,系统就会越来越慢甚至奔溃。
1,查看内存的使用情况
windows 任务管理器
Linux ps-aux命令
GDB查看进程中的内存分布情况
2,借助代码分析工具 mtrace,检查malloc和free有没有成对出现
3,封装malloc 和free,记录申请,释放的信息到日志文件中
4,for while do while 循环的区别:
for循环一般指定一个循环变量,来让代码反复执行 while循环是for循环的精简版,一般用来执行不知道精确次数的循环 do while 与while相似,但do while 至少执行一次
6,#define 与 typedef的区别?
#define INT int typedef int INT; INT num; 如果是普通类型,他们的功能上没有任何区别 #define INIP int* typedef int* INIPP; INIP P1,P2,P3; //只有p1使指针类型 INIPP p1,p2,p3;//三个都是指针类型
7,宏函数与普通函数的区别?
宏函数:带参数的宏替换,只是代码的替换,只是使用使用时像函数,不是真正的函数 函数:是一段具有某项功能的代码的集合,会被翻译成二进制指令,存储在代码段,函数名就是 函数的首地址,有独立的栈内存、命名空间。 函数: 返回值 类型检查 安全 内存申请、释放 跳转不易冗余 宏函数:运算结果 通用 相较危险 替换 速度快 代码会冗余 调用频繁、内容简单的功能适合写成宏函数



