int main()
{
int* p = new int(10); //类型 *p = new 类型(初值) 并返回地址用指针接受
cout << p << *p << endl;
delete p;
cout << p << endl; //指向随机地址,解引用会报错
int* arr = new int[10]; //堆区创建一个数组,返回数组首地址;10代表数组元素
for (int i = 0; i < 10; i++)
{
*arr = i; //对数组初始化
cout << *arr << endl;
arr++;
}
return 0;
}
new关键字在堆区创建一个地址并放入初值,delete之后指针指向的地址中的内容被清空,指针指向随机地址;
在释放开辟的堆区时,本质上时是释放指针指向的区域,因此,释放时的指针应与开辟时相同,否则会出错,如下所示:
#include <iostream>
using namespace std;
int main()
{
int* p = new int(10); //类型 *p = new 类型(初值) 并返回地址用指针接受
cout << p << *p << endl;
delete p;
/*cout << p << endl; */ //指向随机地址,解引用会报错
int* arr = new int[10]; //堆区创建一个数组,返回数组首地址;10代表数组元素
for (int i = 0; i < 10; i++)
{
*arr = i;
cout << *arr << endl;
arr++; //指针改变
}
delete[] arr; //释放的并非开辟时的地址快 报错
return 0;
}
在程序中有一个错误:在使用循环输出 arr 数组中的元素后,使用 delete[] arr 释放内存,但此时 arr 已经指向了数组的末尾,而非数组的首地址。因此,释放内存时应该使用指向数组首地址的指针,而不是指向数组末尾的指针。改正后如下:
#include <iostream>
using namespace std;
int main()
{
int* p = new int(10);
cout << p << " " << *p << endl;
delete p;
int* arr = new int[10];
for (int i = 0; i < 10; i++)
{
*(arr + i) = i;
cout << *(arr + i) << endl;
}
delete[] arr;
return 0;
}
或者不使用指针,而使用数组下标进行赋值:、
#include <iostream>
using namespace std;
int main()
{
int* p = new int(10); //类型 *p = new 类型(初值) 并返回地址用指针接受
cout << p << *p << endl;
delete p;
/*cout << p << endl; */ //指向随机地址,解引用会报错
int* arr = new int[10]; //堆区创建一个数组,返回数组首地址;10代表数组元素
for (int i = 0; i < 10; i++)
{
arr[i] = i;
cout << arr[i] << endl;
}
delete[] arr;
return 0;
}