内存四区的意义:
不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活去编程
第一区 --- 代码区
1.代码区中存放的是二进制代码!!!而不是我们写的高级语言
计算器会将我们写的高级语言转换为二进制数后再存入代码区
1.存放CPU执行的机械指令 --- 这个机械指令其实就是存放在代码区的二进制代码
第二区 --- 全局区
1.全局变量是在所有函数外的变量
const修饰的全局变量可以看作是全局常量
局部变量和局部常量(const修饰)都是存放在栈区
而全局变量,静态变量(static修饰)和常量(分为字符串常量和全局常量(const修饰))都是放在全局区的
第三区 --- 栈区
1.栈区中的的内存空间由编译器来分配和释放
2.局部变量和函数参数都是在函数中的,当函数结束的时候,编译器就会将它们在栈区中分得的内存空间给释放掉
3.由2我们可以推出当我们在调用一个函数后将这个函数中的某个局部变量的地址传出的话就会导致程序出错 --- 原因就是函数一结束,栈区中分给这个函数内的局部变量和参数的内存空间就会被释放,此时我们根据原空间地址是找不到这个内存空间的(因为这个内存空间已经被释放了)--- 找不到就会出现野指针,进而导致程序出错
为了避免这种错误 --- 函数的返回值不能是其局部变量的地址
所以上面这种编程方法是错误的
1.值得注意的是编译器在你返回函数局部变量的地址并解引用的时候 --- 会为你保留一次这个指针指向的数据,但是也只会保留一次,如果你解引用第二次的话指针就会变成野指针,指向一个随机的内存空间
总的来说还是不要返回函数局部变量的地址
第四区 --- 堆区
1.堆区的数据由程序员来分配和释放
2.在c++中如果想在堆区中开辟内存空间的话就需要用到新的关键字 --- new
用new开辟内存堆区空间相关内容:
1.开辟格式 --- new 要开辟的变量的类型(变量中存储的数据) --- 如 new int (10 ) ---这个就是在堆区中开辟了一个整型内存空间,并在这个整型内存空间中存储了 10 这个数据
2.用new关键字开辟了内存空间之后,会将在堆区开辟的内存空间的地址返回 --- 而这个地址的代表就是 new int(10) 这一个开辟整体 --- 返回的地址需要我们用对应类型的指针来接收 ---
int* p = new int(10)
3.上面这个例子中函数的返回值是指针变量,其实这也是一个局部变量但是为什么没有违规操作呢?原因是这个指针变量存的地址是堆区中的一个内存空间的地址,这个内存空间并不会在函数结束的时候就被自动释放,而是要等程序员来手动释放的 --- 所以内存空间没释放,根据地址能够找到内存空间 --- 所以可以直接返回这个指针局部变量