zoukankan      html  css  js  c++  java
  • 常见内存错误的几点总结


    学习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、申请和释放量不匹配:申请了多少内存,在使用完毕后就要释放多少。

    若果没有释放或者少释放了就是内存泄露。多释放了也会产生问题。(尽管程序退出后系统会回收堆空间。但严格的应该申请的堆空间要在程序中释放掉。




  • 相关阅读:
    python虚拟环境使用
    虚拟化网络进阶管理
    虚拟化进阶管理
    KVM虚拟化
    Xen虚拟化
    Virtualization基础
    Virnish使用
    CentOS配置FTP服务器
    Ajax结合Json进行交互数据(四)
    将 数据库中的结果集转换为json格式(三)
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6916438.html
Copyright © 2011-2022 走看看