学习C语言以来一直没有注意到细节的控制,敲代码总是“无所顾忌”的。如今慢慢把程序写大写复杂了。在资源宝贵和的嵌入式中。这个问题越来越须要注意了——内存的管理。。让编程慢慢走上正轨,慢慢走上可预见性吧,慢慢与机器融为一体,慢慢习惯于如梁肇新前辈所说以机器的思维方式思维吧!!!
1、返回局部变量地址将引起内存错误
2、暂时空间过大:操作系统在载入某个应用程序时,都将为其分配一定大小的栈空间,若申请过大的局部变量。可能会引起栈溢出问题。
(PC机上Windows和Linux系统一般不必操心这个,由于有虚拟内存机制。但嵌入式开发就要特别注意这个了——资源有限,一旦栈溢出造成程序错误又是非常难查的~~~)
3、src 和 dst 内存覆盖:在进行字节内存复制时,常会出现这一问题。由于部分系统库函数并没有提供内存覆盖的检測功能,从而导致错误。
例如以下即是源内存区和目的内存区覆盖的演示样例:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main(int argc ,char *argv[])
{
char x[50];
int i;
for(i=0;i<50; i++) x[i]=i ;
strncpy(x+20 ,x ,20) ;//把 x地址开头的20个字节拷贝到以 x+20 开头的内存空间内 ,能够
strncpy(x+20 ,x ,21) ;//把x地址开头的21个字节拷贝到以x+20开头的内存空间内, 目的内存区被覆盖了一个字节
x[39]=‘\o‘; // 在此截断数据段
strcpy(x ,x+20) ; //把 x+20 开头到 x+39这20个字节拷贝到以 x地址开头的内存空间,能够
x[39]=40 ;
x[40]=‘\o‘ ;//在此截断数据段
strcpy(x ,x+20) ;//把 x+20开头到 x+40这21个字节拷贝到以 x地址开头的内存空间。目的内存空间有被覆盖一字节
return 0 ;
}
4、动态内存管理错误
动态申请的堆内存空间须要自己管理
1、申请和释放不一致:因为C++兼容C,而C与C++的内存申请和释放方式不一样,因此在C++程序中。就有两套动态内存管理函数。
正常应该是採用C方式申请就用C方式释放,用C++申请的就要用C++方式释放
2、申请和释放量不匹配:申请了多少内存,在使用完毕后就要释放多少。
若果没有释放或者少释放了就是内存泄露。多释放了也会产生问题。(尽管程序退出后系统会回收堆空间。但严格的应该申请的堆空间要在程序中释放掉。