• C ++内存管理


    1.    c++内存分配方式

    堆:堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。

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

    自由存储区:自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。

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

    常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量(const),不允许修改。

    2.    New/delete 和malloc/free 的却别

    特征

    new/delete

    malloc/free

    操作对象

    运算符

     标准库函数

    分配内存的位置

    自由存储区

    内存分配成功的返回值

    完整类型指针

    void*

    内存分配失败的返回值

    默认抛出异常

    返回NULL

    分配内存的大小

    由编译器根据类型计算得出

    必须显式指定字节数

    处理数组

    有处理数组的new版本new[]

    需要用户计算数组的大小后进行内存分配

    已分配内存的扩充

    无法直观地处理

    使用realloc简单完成

    是否相互调用

    可以,看具体的operator new/delete实现

    不可调用new

    分配内存时内存不足

    客户能够指定处理函数或重新制定分配器

    无法通过用户代码进行处理

    函数重载

    允许

    不允许

    构造函数与析构函数

    调用

    不调用

     

    3.    C++ 中内存泄露有那些因素?

        总结: 一是在堆里创建了对象占用了内存,但是没有显式地释放对象占用的内存;二是在类的构造函数中动态的分配了内存,但是在析构函数中没有释放内存或者没有正确的释放内存;

    a.    在释放对象数组时在delete中没有使用方括号;

    b.    对象数组是指:数组中存放的是对象,只需要delete []p,即可调用对象数组中的每个对象的析构函数释放空间;

    c.     指向对象的指针数组是指:数组中存放的是指向对象的指针,不仅要释放每个对象的空间,还要释放每个指针的空间,delete []p只是释放了每个指针,但是并没有释放对象的空间,正确的做法,是通过一个循环,将每个对象释放了,然后再把指针释放了;  

    d.    没有将基类的析构函数定义为虚函数。基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确是释放,因此造成内存泄露;

     

    4.    C++ 中内存溢出有那些因素?

         内存溢出是指程序在申请内存时没有足够的内存空间供其使用。原因可能如下:

    a.    内存中加载的数据过于庞大;

    b.    代码中存在死循环;

    c.     递归调用太深,导致堆栈溢出等;

    d.    内存泄漏最终导致内存溢出;

  • 相关阅读:
    css text-transform 属性
    CSS3 @media编写响应式页面
    css :first child与:first-of-type的区别
    前端外语网站合集
    webpack配置自动添加CSS3前缀
    vue中extend/component/mixins/extends的区别
    js缓动函数
    [LeetCode] 78. 子集
    [LeetCode] 76. 最小覆盖子串
    [LeetCode] 75. 颜色分类
  • 原文地址:https://www.cnblogs.com/BEN-LK/p/10720265.html
Copyright © 2020-2023  润新知