C/C++内存管理--栈区、堆区、数据区、代码区

非常nice的一篇文章!

在计算机系统中,运行程序 A 将会在内存中开辟程序 A 的内存区域 1,运行程序 B 将会在内存中开辟程序 B 的内存区域 2,内存区域 1 与内存区域 2 之间逻辑分隔。
在这里插入图片描述在这里插入图片描述
在程序 A 开辟的内存区域 1 会被分为几个区域,这就是内存四区,内存四区分为栈区、堆区、数据区与代码区。

  • 栈区指的是存储一些临时变量的区域,临时变量包括了局部变量、返回值、参数、返回地址等,当这些变量超出了当前作用域时将会自动弹出。该栈的最大存储是有大小的,该值固定,超过该大小将会造成栈溢出。

  • 堆区指的是一个比较大的内存空间,主要用于对动态内存的分配;在程序开发中一般是开发人员进行分配与释放,若在程序结束时都未释放,系统将会自动进行回收。

  • 数据区指的是主要存放全局变量、常量和静态变量的区域,数据区又可以进行划分,分为全局区与静态区。全局变量与静态变量将会存放至该区域。

  • 代码区就比较好理解了,主要是存储可执行代码,该区域的属性是只读的。

malloc、free、new、delete都写的很详细。。看大佬文章吧



deletedelete[]的区别给忘了

class A
   {
    
    
    private:
      char *m_cBuffer;
      int m_nLen;

   `` public:
      A(){
    
     m_cBuffer = new char[m_nLen]; }
      ~A() {
    
     delete [] m_cBuffer; }
   };

   A *a = new A[10];
   delete a;         //仅释放了a指针指向的全部内存空间 但是只调用了a[0]对象的析构函数 剩下的从a[1]到a[9]这9个用户自行分配的m_cBuffer对应内存空间将不能释放 从而造成内存泄漏
   delete[] a;      //调用使用类对象的析构函数释放用户自己分配内存空间并且   释放了a指针指向的全部内存空间

猜你喜欢

转载自blog.csdn.net/weixin_44119881/article/details/112203990
今日推荐