C++内存模型

在 C++ 中 ,程序运 行时, 内存 主要 分成 个区 分别是 、数据段 代码段

image

  • 栈: 存储局部变量 函数参数 和返回值。
  • 堆: 储动态开辟 内存 的变量
  • 数据段: 存储全局变 量和 静态变量
  • 代码段: 存储可执行 程序的 代码 常量(例如字符常量) 此存储区不可修改


和堆的主要 区别

1)管理方式不同:栈是系统自动管理的,在出作用域时,将自动被释放;堆需手动释放,若程序中不释放,程序结束时由操作系统回收。


2)空间大小不同:堆内存的大小受限于物理内存空间;而栈就小得可怜,一般只有8M(可以修改系统参数)。


3)分配方式不同:堆是动态分配;栈有静态分配和动态分配(都是自动释放)。


4)分配效率不同:栈是系统提供的数据结构,计算机在底层提供了对栈的支持,进栈和出栈有专门的指令,效率比较高;堆是由C++函数库提供的。


5)是否产生碎片:对于栈来说,进栈和出栈都有着严格的顺序(先进后出),不会产生碎片;而堆频繁的分配和释放,会造成内存空间的不连续,容易产生碎片,太多的碎片会导致性能的下降。


6)增长方向不同:栈向下增长,以降序分配内存地址;堆向上增长,以升序分配内存地址。

动态分配内存n ew 和d elete

使用堆区的内存有四个步骤:


1)声明一个指针;


2)用new运算符向系统申请一块内存,让指针指向这块内存;


3)通过对指针解引用的方法,像使用变量一样使用这块内存;


4)如果这块内存不用了,用delete运算符释放它。


申请内存的语法:new 数据类型(初始值);   // C++11支持{}


如果申请成功,返回一个地址;如果申请失败,返回一个空地址(暂时不考虑失败的情况)。


释放内存的语法:delete 地址;


释放内存不会失败(还钱不会失败)。


注意:

动态分配出来的内存没有变量名,只能通过指向它的指针来操作内存中的数据。

如果动态分配的内存不用了,必须用delete释放它,否则有可能用尽系统的内存。

动态分配的内存生命周期与程序相同,程序退出时,如果没有释放,系统将自动回收。

就算指针的作用域已失效,所指向的内存也不会释放。

用指针跟踪已分配的内存时,不能跟丢。

#include <iostream>         // 包含头文件。
using namespace std;        // 指定缺省的命名空间。
int main()
    // 1)声明一个指针;
    // 2)用new运算符向系统申请一块内存,让指针指向这块内存;
    // 3)通过对指针解引用的方法,像使用变量一样使用这块内存;
    // 4)如果这块内存不用了,用delete运算符释放它。
    // 申请内存的语法:new 数据类型(初始值);   // C++11支持{}
    // 释放内存的语法:delete 地址;
    int* p = new int(5);
    cout << "*p=" << *p << endl;
    *p = 8;
    cout << "*p=" << *p << endl;
    delete p;
    /*  for (int i = 1; i > 0; i++)
        int* p = new int[100000];     // 一次申请100000个整数
        cout << "i="<<i<<",p=" << p << endl;
                用于动态内存的 C++ 中的 new 和 delete 运算符
            
C/C++ 中的动态内存分配是指由程序员手动进行内存分配。动态分配的内存在堆上分配,非静态和局部变量在堆栈上分配内存。
【C++要笑着学】C++动态内存管理 | new/delete底层探索 | new/delete实现原理 | 定位new(二)
是这样的,C语言里的 "动态内存管理" 放到 C++ 里面,用起来不是那么爽,所以C++就对这一块进行了升级,本章我们就探索探索 C++的内存管理,顺便复习一下C语言里讲过的动态内存管理的知识。学完本章,单身的同学不用怕了,以后没有对象我们可以 new 一个
【C++要笑着学】C++动态内存管理 | new/delete底层探索 | new/delete实现原理 | 定位new(一)
是这样的,C语言里的 "动态内存管理" 放到 C++ 里面,用起来不是那么爽,所以C++就对这一块进行了升级,本章我们就探索探索 C++的内存管理,顺便复习一下C语言里讲过的动态内存管理的知识。学完本章,单身的同学不用怕了,以后没有对象我们可以 new 一个