在C++中主要利用new在堆区开辟内存
注意:堆区开辟的数据由程序员分配释放,若程序员不释放,程序结束时由操作系统回收
1.在栈区不能返回局部变量的地址
#include<iostream>
using namespace std;
int * func(int b)
{
int p=10;
return &p;
}
int main()
{
int *p=func(1);
cout<<*p<<endl;
cout<<*p<<endl;
return 0;
}
在第一次输出时,可以得到正确的结果10,在第二次输出时会得到一个乱码,因为局部变量存放在栈区,函数执行完毕自动释放内存,为防止后面还要用,系统会保存一下,所以第二次无法得到正确的结果。
2.使用new()运算符在堆区操作
#include<iostream>
using namespace std;
int * func()
{
int *p=new int(10);
return p;
}
int main()
{
int *p=func();
cout<<*p<<endl;
return 0;
}
- 利用new()关键字可以创建堆区的数据
- 这个数据创建好后,返回的是这个数据在堆区的地址,需要用指针来接收
3.new的基本语法
3.1创建
new返回的是该数据类型的指针
#include<iostream>
using namespace std;
int* func()
{
int* p = new int(10);
return p;
}
void test01()
{
int* p = func();
cout << *p << endl;
cout << *p << endl;
}
int main()
{
test01();
return 0;
}
3.2释放
用delete关键字
#include<iostream>
using namespace std;
int* func()
{
int* p = new int(10);
return p;
}
void test01()
{
int* p = func();
cout << *p << endl;
cout << *p << endl;
delete p;
//cout << *p << endl;
}
int main()
{
test01();
return 0;
}
只会打印两个,最后一个因为已经释放内存了,不会打印
4.在堆区利用new开辟数组
4.1创建
#include<iostream>
using namespace std;
void test02()
{
//在堆区创建10个整型数据的数组
int* arr = new int[10];//10代表数组有10个元素
for (int i = 0; i < 10; i++)
{
arr[i] = i + 100;//给10个数据赋值
}
for (int i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
}
int main()
{
test02();
return 0;
}
4.2释放
//释放堆区数组
delete[] arr;
在前面加一个中括号,告诉编译器释放的是数组