zoukankan      html  css  js  c++  java
  • 内存操作经典问题分析

    • 杜绝野指针
    1. 指针变量中的值是非法的内存地址,进而形成野指针
    2. 野指针不是NULL指针,是指向不可用内存地址的指针
    3. NULL指针并无危害,很好判断,也很好调试
    4. C语言中更无法判断一个指针保存的地址是否合法
    • 野指针的由来
    1. 局部指针变量没有初始化(定义指针需要初始化NULL)
    2. 指针所指向的变量在指针之前被销毁
    3. 使用已经释放过的指针(free)
    4. 进行了错误的强制类型转换
    • 基本原则
    1.  绝不返回局部变量和局部数组的地址(因为函数在运行完后将会释放栈)
    2. 任何变量在定义后必须初始化为0
    3. 字符数组必须确认0结束符后才能成为字符串
    4. 任何使用与内存操作相关的函数必须指定长度信息
    • 常见内存错误
    1. 结构体成员指针未初始化:
    2. 结构体成员指针未分配足够的内存
    3. 内存分配成功,但未初始化
    4. 内存操作越界
    • 内存操作的交通规则
    1. 动态内存申请后,应该立刻检查指针,值是否为NULL,防止使用NULL指针
    2. free指针之后必须立刻赋值NULL
    3. 任何与内存操作相关的操作都必须带长度信息
    4. malloc操作和free操作必须匹配,防止内存泄露和多次释放,在main函数中的malloc应该在main中free,在func函数中的malloc应该在func中free。
    void print(int*p,int size)
    {
        int i = 0;
        char buf[128] = {0};
        snprintf(buf,sizeof(buf),"%s","Hello World!");
        for(i=0;i<size;i++)
        {
            printf("%d
    ",p[i]);
        }
    }
     
    小结:
    1. 内存错误的本质源于指针保存的地址为非法值
    2. 指针变量未初始化,保存随机数
    3. 指针运算导致内存越界
    4. 内存泄露源于malloc与free不匹配
    5. 当malloc次数多于free时产生内存泄露
    6. 当malloc次数少于free时,程序可能崩溃
     
     
     
    主要记录的是学习听课的笔记
  • 相关阅读:
    一个简单而经典的RTX51 Tiny应用实例
    基于HttpClient 4.3的可訪问自签名HTTPS网站的新版工具类
    动态绑定与动态分发-动态绑定暗含动态分发
    多态是面向接口编程的概念
    多态本质:多个对象共享同一接口 多态本质是共享接口
    Smalltalk
    Simula-Virtual function
    执行力
    目标、计划:下定决心 排除万难
    当断不断,必受其乱
  • 原文地址:https://www.cnblogs.com/chengeputongren/p/12175726.html
Copyright © 2011-2022 走看看