1.内存的分区模型

c++程序中在执行时,内存分为四个部分

  • 代码区:存放函数体的二进制代码,操作系统进行管理(共享,只读,在频繁使用时不会造成资源浪费)
  • 全局区:存放全局变量和静态变量以及常量

在代码编译前就会产生的区域 ⬆
栈区和堆区在编译后产生

  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等(所以不要返回局部变量的地址)
  • 堆区:由程序员分配和释放,若程序员没有释放,由程序结束时操作系统回收。主要是使用new再堆区中开辟内存。

有不同的生存周期,更灵活的编程

  1. #include<iostream>
  2. using namespace std;
  3. int * func(){
  4. int a = 10;
  5. return &a;//不能返回 局部变量 的地址,局部变量位于栈区
  6. }
  7. int main(void){
  8. int *p = func();
  9. cout<<*p<<endl;//第一次可以输出,因为编译器会第一次保留防止误操作
  10. cout<<*p<<endl;//第二次输出乱码
  11. }
  12. 4 6 D:\c++\栈区.cpp [Warning] address of local variable 'a' returned [-Wreturn-local-addr]
  1. //利用new在堆区开辟数据
  2. #include<iostream>
  3. using namespace std;
  4. int* func(){
  5. int *p = new int(10);
  6. return p;
  7. }
  8. int main(void){
  9. cout << *func()<<endl;
  10. cout << *func()<<endl;//还是输出10,因为堆区的数据由程序员自己释放。
  11. }

应当注意的是,在这里,指针也是局部变量,也是堆区地址。
new操作符:
用于在堆区开辟数据,用delete关键字手动释放内存。
语法 new 数据类型(初始值)new int(10)返回类型是该数据类型的指针,与c语言的malloc略有不同,malloc返回的是无类型指针void*,参数是字节大小。用new开辟数组 new int[10]