您的位置:首页 > 编程语言 > C语言/C++

c++中new和delete的使用方法

2014-04-13 22:28 337 查看
c++中new和delete的使用方法

new和delete运算符用于动态分配和撤销内存的运算符

new用法:

1. 开辟单变量地址空间

1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个int类型的地址赋值给整型指针a.

2)int *a = new int(5) 作用同上,但是同时将整数赋值为5

2. 开辟数组空间

一维: int *a = new int[100];开辟一个大小为100的整型数组空间

二维: int **a = new int[5][6]

三维及其以上:依此类推.

一般用法: new 类型 [初值]

delete用法:

1. int *a = new int;

delete a; //释放单个int的空间

2.int *a = new int[5];

delete [] a; //释放int数组空间

要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.

用new和delete可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它.

C++ new 运算符与 delete 运算符

到目前为止,您都是事先定义好所要使用的变量,当程序开始执行时,这些变量就会自动被配置内存空间。

然而有时有些变量并不知道何时会被使用,您希望在使用到的时候再配置空间给变量,并在变量不使用的时候,将变量所占有的空间还给内存,这时候我们可以使用new运算符与delete运算符。

举个简单的例子来说,您可以在程序中以动态的方式来配置一个int类型大小的内存,例如:

int *ptr = new int;

在这段程序中,new运算符会配置一个int所需要的空间,并传回该空间的地址,所以您使用指针ptr来储存这个地址,这段程序只配置空间但不初始空间中的储存值,如果要在配置完成后指定储存值,则可以如此定义:

int *ptr = new int(100);

这段程序在配置空间之后,会将空间中的储存值设定为100,以下使用一个简单的程序来示范动态配置的使用:

#include <iostream>

using namespace std;

int main() {

int *ptr = new int(100);

cout << "空间位置:" << ptr

<< endl;

cout << "空间储存值:" << *ptr

<< endl;

*ptr = 200;

cout << "空间位置:" << ptr

<< endl;

cout << "空间储存值:" << *ptr

<< endl;

delete ptr;

return 0;

}

执行结果:

空间位置:0x3d2458

空间储存值:100

空间位置:0x3d2458

空间储存值:200

使用new运算符动态配置的空间,在整个程序结束前并不会自动归还给内存,您必须使用delete将这个空间还给内存,如上面的程序在结束前所作的动作,在这个程序中,虽然显示完毕后程序也就结束,但这边还是示范delete的用法,而这也是个好习惯,日后您的程序在持续执行过程中若大量使用new而没有适当的使用delete的话,由于空间一直没有归还,最后将导致整个内存空间用尽。

接下来看一个简单的易失存储器配置的应用,您知道数组使用的一个缺点,就是数组的大小必须事先决定好,然而有时候您无法知道我们会使用多大的数组,或者希望由用户自行决定数组大小,这时候您就可以使用易失存储器配置加上指针运算来解决这个问题,先说明数组动态配置的方式,如下所示:

int *arr = new int[1000];

这段程序代码动态配置了1000个int大小的空间,并传回空间的第一个地址,配置后的空间数据是未知的,没有方法在动态配置数组空间后同时定义元素初值。

同样的,使用new配置得来的空间,在不使用时应该使用delete归还给内存,方法如下:

delete [] arr;

注意在使用delete归还数组空间给内存时,我们必须加上[ ],表示归还的是整个数组空间。

下面这个程序是个数组动态配置的简单示范:

#include <iostream>

using namespace std;

int main() {

int size = 0;

cout << "请输入数组长度:";

cin >> size;

int *arr = new int[size];

cout << "指定元素值:" << endl;

for(int i = 0; i < size; i++) {

cout << "arr[" << i << "] = ";

cin >> *(arr+i);

}

cout << "显示元素值:" << endl;

for(int i = 0; i < size; i++) {

cout << "arr[" << i << "] = " << *(arr+i)

<< endl;

}

delete [] arr;

return 0;

}

执行结果:

请输入数组长度:5

指定元素值:

arr[0] = 1

arr[1] = 2

arr[2] = 3

arr[3] = 4

arr[4] = 5

显示元素值:

arr[0] = 1

arr[1] = 2

arr[2] = 3

arr[3] = 4

arr[4] = 5

您也可以使用指针来仿真二维数组,只要清楚二维数组中的两个维度的索引值之位移量就可以了,这在 二维数组 中有谈到了,下面这个程序是个简单的示范:

#include <iostream>

using namespace std;

int main() {

int m = 0;

int n = 0;

cout << "输入二维数组维度:";

cin >> m >> n;

int *ptr = new int[m*n];

for(int i = 0; i < m; i++) {

for(int j = 0; j < n; j++) {

*(ptr + n*i + j) = i+j;

}

}

for(int i = 0; i < m; i++) {

for(int j = 0; j < n; j++) {

cout << *(ptr+n*i+j) << "\t";

}

cout << endl;

}

delete [] ptr;

return 0;

}

执行结果:

输入二维数组维度:4 5

0 1 2 3 4

1 2 3 4 5

2 3 4 5 6

3 4 5 6 7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: