首页 > 代码库 > 常见内存错误的几点总结

常见内存错误的几点总结


学习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、申请和释放量不匹配:申请了多少内存,在使用完成后就要释放多少。若果没有释放或者少释放了就是内存泄露,多释放了也会产生问题。(虽然程序退出后系统会回收堆空间,但严格的应该申请的堆空间要在程序中释放掉。



常见内存错误的几点总结