C++Note 内存分区 栈区 堆区 堆区变量和数组的释放

栈区:

  由编译器自动分配和释放 存放函数的参数值 局部变量等

  注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放

 func()执行完毕时,a使用的内存已经释放 cout输出乱码

不要返回局部变量的地址

堆区:

  由程序员分配释放 若程序员不释放 程序结束时由操作系统回收

  在C++中主要利用 new 在堆区开辟内存

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int* func()
 5 {
 6     //利用new关键字 可以将数据开辟到堆区   本函数是指针函数 返回值为指针  a为指针变量 
 7     //指针本质也是局部变量 放在栈上  指针保存的数据是放在了堆区
 8     int* a = new int(10);//在堆区new一个整型区域 存放整型变量 10
 9     return a;
10 }
11 int main() 
12 {
13     int* p = func();
14     cout << *p << endl; // 10
15     cout << *p << endl; // 10
16     system("pause");
17     return 0;
18 }
复制代码

C++中利用new操作符在堆区开辟数据

释放利用操作符用 delete

语法: new 数据类型

利用new创建的数据  会返回该数据对应的类型的指针

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int* func()
 5 {
 6     //在堆区创建整型数据
 7     //new返回是 该数据类型的指针
 8     int* p = new int(10);
 9     return p;
10 }
11 void test01()
12 {
13     int* p = func();
14     cout << *p << endl;//10
15     cout << *p << endl;//10
16     //堆区的数据 由程序员管理开辟 程序员管理释放
17     //如果要释放  利用关键字delete
18     delete p;//释放指针p 即地址
19     //cout << *p << endl;//弹出异常 内存已被释放 
20     //前面两个 *p正常输出 
21 }
22 void test02()
23 {
24     //创建10个整型的数组  在堆区
25     int* arr = new int[10];//10代表数组有10个元素   返回数组的首地址
26     for (int i = 0; i < 10; i++)
27     {
28         arr[i] = i + 100;//给10个元素赋值 100~109
29     }
30     for (int i = 0; i < 10; i++)
31     {
32         cout << arr[i] << endl;
33     }
34     //释放堆区数组
35     delete[] arr;//加[]表明 释放数组
36 }
37 int main() 
38 {
39     //test01();
40     test02();
41     system("pause");
42     return 0;
43 }
复制代码

 函数指针和指针函数: 指针函数是返回指针的函数,函数指针是指向函数的指针

posted on   廿陆  阅读(20)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示