zoukankan      html  css  js  c++  java
  • c++(1)----堆内存、栈内存

    一、在C++内存管理中:

    动态分配内存的区域称之为堆内存。

      new 和 delete 操作的区域是 free store(heap 的子集)

           malloc 和 free 操作的区域是 heap

    函数调用过程中产生的本地变量和调用数据的区域称之为栈。

    二、堆内存:

    动态内存分配有一定的不确定性(分配时间等),在实时性要求比较高的场合会避免使用。

    使用堆上分配内存,内存管理器涉及的操作:

      1.分配    2.释放  3.垃圾回收(寻找不使用的内存块,予以自动释放)

            c++ 有1,2      java 有1,3

    C++释放内存,内存管理器还涉及将连续未使用的内存块合并。

     常见的造成内存泄漏的原因:

        分支或异常,导致delete 得不到执行

      

    三、栈内存

    在大多数x86机器上,栈的增长方向是,高地址---->低地址

    调用函数栈内存的变化:

      压参数---->压返回地址(下一条指令的地址)-------跳转到新函数---->压入寄存器保留空间(一些保存工作)------>分配本地变量

    栈后进先出,不存在内存碎片。

    栈展开:

      函数执行发生异常的情况,自动调用析构函数,需编译器的支持。EHsc

     

    四、RAII

    参考:https://www.jianshu.com/p/b7ffe79498be

    利用将对象存储在栈上,自动调用析构函数的方式管理资源,对超出作用域的对象进行释放。

    对超出作用域的对象进行释放
    enum class shape_type {
      circle,
      triangle,
      rectangle,
      …
    };
    
    class shape { … };
    class circle : public shape { … };
    class triangle : public shape { … };
    class rectangle : public shape { … };
    
    shape* create_shape(shape_type type)
    {
      …
      switch (type) {
      case shape_type::circle:
        return new circle(…);
      case shape_type::triangle:
        return new triangle(…);
      case shape_type::rectangle:
        return new rectangle(…);
      …
      }
    }
    
    
    
    // 将指针,放到一个本地变量中,确保析构函数会删除该对象
    class shape_wrapper {
    public:
      explicit shape_wrapper(
        shape* ptr = nullptr)
        : ptr_(ptr) {}
      ~shape_wrapper()
      {
        delete ptr_;
      }
      shape* get() const { return ptr_; }
    private:
      shape* ptr_;
    };
    
    void foo()
    {
      …
      shape_wrapper ptr_wrapper(
        create_shape(…));
      …
    }
    View Code

      

    函数执行发生异常的情况
    new 和 delete 操作的区域是 free storemalloc 和 free 操作的区域是 heap
  • 相关阅读:
    docker 加速器配置目录
    php 超时设置笔记
    php socket通过smtp发送邮件(纯文本、HTML,多收件人,多抄送,多密送)
    fabric 安装
    centos7下使用yum安装pip
    【转】linux tar 压缩
    ASP.NET MVC 5 默认模板的JS和CSS 是怎么加载的?
    NHibernate with ASP.NET MVC 入门示例
    Ajax入门
    NHibernate入门
  • 原文地址:https://www.cnblogs.com/feihu-h/p/12205441.html
Copyright © 2011-2022 走看看