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



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


绿色通道: 好文要顶 关注我 收藏该文与我联系



jazmfg
关注 - 1
粉丝 - 4



+加关注


7

1


(请您对文章做出评价)


« 上一篇:vector的用法
» 下一篇:VC++中bmp图象的显示


posted on 2008-11-30 16:24 jazmfg 阅读(158056) 评论(9) 编辑 收藏


评论:

#1楼 ctycheer[未注册用户] Posted @ 2009-05-22 15:13

int *a = new int[5][6]
vc里行不通
应该是
int(*a)[6]=new int[5][6]




#2楼[楼主] jazmfg Posted @ 2009-05-23 18:18

@ctycheer
哦?我当初尝试的时候可以通过啊,那我再去试试,谢谢您的提醒!

支持(0)反对(0)




#3楼 xnzxc[未注册用户] Posted @ 2009-08-26 01:04

int *a = new int[5][6]
确实有问题




#4楼[楼主] jazmfg Posted @ 2009-08-26 10:21

@xnzxc
不好意思,确实是我写错了,应该是int **a = new int[5][6]

支持(0)反对(0)




#5楼 kkmm Posted @ 2010-10-20 23:54

“要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.”
也可以使用变量名加数组下标访问的。

支持(0)反对(0)




#6楼 Rollen Holt Posted @ 2010-12-17 14:02

其实对于这个数组的动态分配问题有很多的解决办法的。比如vector容器,可以参见我的文章:http://www.cnblogs.com/rollenholt/articles/1907415.html
呵呵。







1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35


首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:

int **p = new int*[num1];

而对每一个*p(一共num1个*p)申请一组内存空间:

for(int i=0; i<num1; ++i)

p[i] = new int[num2];

其中,num1是行数,num2是数组的列数。测试的源程序如下:

#include <iostream>

#include <iomanip>

using namespace std;

int main()

{

int num1;//行数

int num2;//列数

cout<<"Please enter the number for row and column: "<<endl;

cin >> num1 >> num2;

//为二维数组开辟空间

int **p;

p= new int*[num1];

for(int i=0; i<num1; ++i)

p[i] = new int[num2];

for(int j=0;j<num1;j++)

{

for(int k=0;k<num2;k++)

{

p[j][k]=(j+1)*(k+1);

cout<<setw(6)<<p[j][k]<<':'<<setw(8)<<&p[j][k];

}

cout<<endl;

}

//释放二维数组占用的空间

for(int m=0;m<num1;m++)

delete[] p[m];

delete[] p;

return 0;

}









1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41


根据以上一、二维数组,可以推出三维数组的实现。以下是指针实现代码:

#include <iostream>

using namespace std;

void main()

{

int ***p3;

intx=3,y=2,z=2;

p3=new int **[x];

for (i=0;i<x;i++)

{

p3[i]=new int* [y];

for (int j=0;j<y;j++)

{

p3[i][j]=new int[z];

for (int k=0;k<z;k++)

{

p3[i][j][k]=i*j*k;

}

}

}

for (int k=0;k<z;k++)

{

for (int i=0;i<x;i++)

{

for (int j=0;j<y;j++)

cout<<p3[i][j][k]<<" " ;

cout<<endl;

}

cout<<endl;

}



for (int i=0;i<x;i++)

{

for (int j=0;j<y;j++)

{

delete [] p3[i][j];

}

delete [] p3[i];

}

delete [] p3;

}


其实也是可以用一维数组实现的。比如:







1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46


用一维动态数组表示二维、三维动态数组

以下是程序代码:

#include <iostream>

using namespace std;

void main()

{

int m=3,n=4,l=2;

int *p2; //将表示二维数组

p2=new int[m*n];

int i,j,k;

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

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

{

p2[i*n+j]=i+j;

}

cout<<"二维数组"<<endl;

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

{

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

{

cout<<p2[i*n + j]<<" ";

}

cout<<endl;

}

delete []p2;

int *p3; //将表示三维数组

p3=new int[m*n*l];

for (k=0;k<l;k++)

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

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

{

p3[k*n*m + i*n + j]=i+j+k;

}

cout<<"三维数组"<<endl;

for (int k=0;k<l;k++)

{

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

{

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

cout<<p3[k*n*m + i*n + j]<<" " ;

cout<<endl;

}

cout<<endl;

}

delete []p3;

}


呵呵,对吧。很高兴认识博主,希望可以做个朋友。我是吉林大学软件学院大二的。希望以后可以多多交流。呵呵。欢迎去我的博客转转。
支持(0)反对(0)




#7楼 wanglc_work Posted @ 2013-01-22 09:58

很不错啊

支持(0)反对(0)




#8楼 旅行的蜗牛 Posted @ 2013-05-10 14:34

若是这种情况该怎么delete 掉呢?







1

2

3

4

5

6

7


int *b;

int t = 1;

while (t<INT_MAX/100)

{

b = new int[4];

t++;

}


支持(0)反对(0)




#9楼 过去的时光 Posted @ 2014-01-03 15:59

@旅行的蜗牛
有两种方法可以删除。
1 直接在while循环内添加delete b;
2 每次保存b的临时值,在程序最后一起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
7
1
(请您对文章做出评价)
« 上一篇: vector的用法
» 下一篇: VC++中bmp图象的显示
posted on 2008-11-30 16:24 jazmfg 阅读( 158056) 评论( 9) 编辑 收藏
评论:
  • #1楼    ctycheer[未注册用户] Posted @ 2009-05-22 15:13
    int *a = new int[5][6]
    vc里行不通
    应该是
    int(*a)[6]=new int[5][6]
      

  • #2楼 [ 楼主]   jazmfg   Posted @ 2009-05-23 18:18
    @ctycheer
    哦?我当初尝试的时候可以通过啊,那我再去试试,谢谢您的提醒!
      

  • #3楼    xnzxc[未注册用户] Posted @ 2009-08-26 01:04
    int *a = new int[5][6]
    确实有问题
      

  • #4楼 [ 楼主]   jazmfg   Posted @ 2009-08-26 10:21
    @xnzxc
    不好意思,确实是我写错了,应该是int **a = new int[5][6]
      

  • #5楼    kkmm   Posted @ 2010-10-20 23:54
    “要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.”
    也可以使用变量名加数组下标访问的。
    http://pic.cnitblog.com/face/u171585.jpg   

  • #6楼    Rollen Holt   Posted @ 2010-12-17 14:02
    其实对于这个数组的动态分配问题有很多的解决办法的。比如vector容器,可以参见我的文章:http://www.cnblogs.com/rollenholt/articles/1907415.html
    呵呵。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:
    int **p = new int *[num1];
    而对每一个*p(一共num1个*p)申请一组内存空间:
    for ( int i=0; i<num1; ++i)
      p[i] = new int [num2];
    其中,num1是行数,num2是数组的列数。测试的源程序如下:
    #include <iostream>
    #include <iomanip>
    using namespace std;
    int main()
    {
    int num1; //行数
    int num2; //列数
    cout<< "Please enter the number for row and column: " <<endl;
    cin >> num1 >> num2;
    //为二维数组开辟空间
    int **p;
    p= new int *[num1];
    for ( int i=0; i<num1; ++i)
    p[i] = new int [num2];
    for ( int j=0;j<num1;j++)
    {
    for ( int k=0;k<num2;k++)
    {
      p[j][k]=(j+1)*(k+1);
      cout<<setw(6)<<p[j][k]<< ':' <<setw(8)<<&p[j][k];
    }
    cout<<endl;
    }
    //释放二维数组占用的空间
    for ( int m=0;m<num1;m++)
    delete [] p[m];
    delete [] p;
    return 0;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    根据以上一、二维数组,可以推出三维数组的实现。以下是指针实现代码:
    #include <iostream>
    using namespace std;
    void main()
    {
      int ***p3;
      intx=3,y=2,z=2;
      p3= new int **[x];
      for (i=0;i<x;i++)
      {
      p3[i]= new int * [y];
      for ( int j=0;j<y;j++)
      {
      p3[i][j]= new int [z];
      for ( int k=0;k<z;k++)
      {
      p3[i][j][k]=i*j*k;
      }
      }
      }
      for ( int k=0;k<z;k++)
      {
      for ( int i=0;i<x;i++)
      {
      for ( int j=0;j<y;j++)
      cout<<p3[i][j][k]<< " " ;
      cout<<endl;
      }
      cout<<endl;
      }
     
      for ( int i=0;i<x;i++)
      {
      for ( int j=0;j<y;j++)
      {
      delete [] p3[i][j];
      }
      delete [] p3[i];
      }
      delete [] p3;
    }

    其实也是可以用一维数组实现的。比如:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    用一维动态数组表示二维、三维动态数组
    以下是程序代码:
    #include <iostream>
    using namespace std;
    void main()
    {
      int m=3,n=4,l=2;
      int *p2; //将表示二维数组
      p2= new int [m*n];
      int i,j,k;
      for (i=0;i<m;i++)
      for (j=0;j<n;j++)
      {
      p2[i*n+j]=i+j;
      }
      cout<< "二维数组" <<endl;
      for (i=0;i<m;i++)
      {
      for (j=0;j<n;j++)
      {
      cout<<p2[i*n + j]<< " " ;
      }
      cout<<endl;
      }
      delete []p2;
      int *p3; //将表示三维数组
      p3= new int [m*n*l];
      for (k=0;k<l;k++)
      for (i=0;i<m;i++)
      for (j=0;j<n;j++)
      {
      p3[k*n*m + i*n + j]=i+j+k;
      }
      cout<< "三维数组" <<endl;
      for ( int k=0;k<l;k++)
      {
      for ( int i=0;i<m;i++)
      {
      for ( int j=0;j<n;j++)
      cout<<p3[k*n*m + i*n + j]<< " " ;
      cout<<endl;
      }
      cout<<endl;
      }
      delete []p3;
    }

    呵呵,对吧。很高兴认识博主,希望可以做个朋友。我是吉林大学软件学院大二的。希望以后可以多多交流。呵呵。欢迎去我的博客转转。
    http://pic.cnitblog.com/face/243280/20140807185513.png   

  • #7楼    wanglc_work   Posted @ 2013-01-22 09:58
    很不错啊
    http://pic.cnitblog.com/face/u295621.jpg?id=18192833   

  • #8楼    旅行的蜗牛   Posted @ 2013-05-10 14:34
    若是这种情况该怎么delete 掉呢?
    ?
    1
    2
    3
    4
    5
    6
    7
    int *b;
    int t = 1;
    while (t<INT_MAX/100)
    {
         b = new int [4];
         t++;
    }
      

  • #9楼 2850987 2014/1/3 15:59:51   过去的时光   Posted @ 2014-01-03 15:59
    @旅行的蜗牛
    有两种方法可以删除。
    1 直接在while循环内添加delete b;
    2 每次保存b的临时值,在程序最后一起delete。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值