2012年5月23日

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 @ 2012-05-23 12:03 ergouge 阅读(271) | 评论 (0)编辑 收藏

2012年5月20日

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

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

posted @ 2012-05-20 16:48 ergouge 阅读(144) | 评论 (0)编辑 收藏

仅列出标题  
<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜