C++入门笔记(黑马)-内存分区模型

C++入门资料:https://www.bilibili.com/video/BV1et411b73Z?p=89
最近在学习C++,B站上的黑马视频真的不错,给大家分享一下自己记录的笔记。基本和黑马课件没什么区别,因为自己找不到资源,就自己手打一份

1内存分区模型

C++程序在执行时,将内存大方向划分为***4个区域***

  • 代码区:存放函数体的二进制代码,由操作系统进行管理
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区:有编译器自动分配释放,存放函数的参数值、局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束后,由操作系统回收

1.1 程序运行前

在程序编译后,生成exe可执行程序,为执行该程序前分为两个区域:
代码区:
 存放CPU执行的机器指令
 代码区是共享的,共享的目的是对于频繁执行的程序,只需要在内存中有一份代码即可
 代码区是只读

全局区:
 全局变量和静态变量存放在此
 全局区还包含了常量区,字符串常量和其他常量也存放于此
该区域的数据在程序结束后由操作系统释放

不在全局区的:
 局部变量,const修饰的局部变量(局部常量)

在全局区的:
 全局变量——定义在函数体外的变量
 静态变量——用关键字 static 修饰的变量
 字符串常量——使用双引号的字符串,如 “Hello”
 全局常量——使用const修饰的全局变量

##1.2 程序运行后
栈区
 由编译器自动分配释放,存放函数的参数值局部变量
 **注意事项:**不要反悔局部变量的地址,栈区开辟的数据由编译器自动释放

堆区
 由程序员分配释放,若程序员不释放,程序结束后由操作系统回收。
 C++中主要利用new在堆区开辟内存

代码
#include
using namespace std;

// 通过 new 关键字在堆区开辟了一个内存空间,存放int型变量,值为10
// new 关键字将堆区的地址传递给局部指针变量 *p
int* func()
{
    //利用new关键字, 可以将数据开辟到堆区

    // 指针,本质上是个变量,也是局部变量,放在栈上,指针保存的数据是放在堆区
    int *p=new int(10);  // 返回一个指针

    return p;
}

// 定义一个main函数中的局部指针变量 *p,接受函数func()返回的地址
// 解引用这个地址的时候,他就找到了堆区上面的数据10
int main() {

    //在堆区开辟数据
    int *p = func();
    cout << p << endl;
    cout << *p << endl;
    return 0;
}

##1.3 new 操作符

 C++中利用new操作符在堆区开辟数据
 堆区开辟的数据,由程序员手工开辟、手动释放、释放利用操作符 delete
 语法: new 数据类型

你可能感兴趣的