• C/C++编程之内存管理


    内存分配方式

    内存分配方式一共有三种:

    (1)从静态存储区域分配;

    内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如,全局变量,静态变量。

    (2)在栈上创建;

    在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束后这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    (3)在堆上分配,亦称动态内存分配;

    程序在运行的时候用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或者delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但是问题也多。

    内存释放问题

    (1)静态存储区域以及创建的栈,在函数执行完以后,出栈销毁,这个过程会释放静态分配的内存,不需要程序员手动操作;

    (2)而动态分配的内存,实际是在堆上,系统没法自动释放堆上的内存,需要程序员手动写free或者delete函数来告诉系统需要释放堆上哪个位置的内存;

    常见的内存错误及对策

    (1)内存尚未分配成功,却使用了它;

    解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口使用assert(p != NULL) 进行检查,如果是用malloc或者new来申请的,应该用

    if (p == NULL)或者 if (p != NULL) 来进行防错处理。

    (2)内存分配虽然成功,但是尚未初始化就引用它;

    错误原因:一是没有初始化的观念,二是误以为内存的缺省初值全为零,导致引用初值错误(如数组)。

    解决办法:内存的缺省初值是什么并没有统一的标准,尽管有些时候为零值,但是宁可信其有,不可信其无,无论以何种方式创建数组,都要赋初值。

    (3)内存分配成功并初始化,但是超过了内存的边界;

    这种问题常出现在数组越界,写程序是要仔细。

    (4)忘记释放内存,造成内存泄露;

    含有这种错误的函数每次被调用都会丢失一块内存,开始时内存充足,看不到错误,但终有一次程序死掉,报告内存耗尽。

    内存管理需要遵循的规则

    (1)用malloc 或者 new 申请内存之后,应该立即检查指针值是否为 NULL ,防止使用指针值为NULL的内存;

    (2)不要忘记数组和动态内存赋初值,防止未被初始化的内存作为右值使用;

    (3)避免数组或者指针下标越界,特别要当心“多1”或者“少1”的操作;

    (4)动态内存的申请与释放必须配对,防止内存泄露;

    (5)用free或者delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”;


    注意了以上问题,在内存管理方面,我想应该不会出现bug了吧,呵呵。


  • 相关阅读:
    Python 数据类型:字典
    .Net开发工程师工具箱
    Javascript事件设计模式(七)
    LINQ学习之旅 (四)
    JavaScript实现抽象类与虚方法(六)
    Javascript中的反射机制(五)
    Javascript中类的实现机制(四)
    Javascript中的函数(三)
    Javascript面向对象基础(二)
    Web应用程序项目XXXX已配置为使用IIS。无法访问IIS 元数据库。您没有足够的特权访问计算机上的IIS
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214963.html
Copyright © 2020-2023  润新知