c++中new和delete的使用方法(2)

举个简单的例子来说,您可以在程序中以动态的方式来配置一个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*+ 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

posted on 2012-05-23 12:03 ergouge 阅读(271) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜