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

posted on 2020-01-17 13:54  feihu_h  阅读(336)  评论(0编辑  收藏  举报

导航