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可以动态开辟,撤销地址空间.在编程序时,若用完一个变量(一般是暂时存储的数组),下次需要再用,但却又想省去重新初始化的功夫,可以在每次开始使用时开辟一个空间,在用完后撤销它.
-
-
@ctycheer
哦?我当初尝试的时候可以通过啊,那我再去试试,谢谢您的提醒!
-
int *a = new int[5][6]
确实有问题
-
@xnzxc
不好意思,确实是我写错了,应该是int **a = new int[5][6]
-
“要访问new所开辟的结构体空间,无法直接通过变量名进行,只能通过赋值的指针进行访问.”http://pic.cnitblog.com/face/u171585.jpg
也可以使用变量名加数组下标访问的。
-
其实对于这个数组的动态分配问题有很多的解决办法的。比如vector容器,可以参见我的文章:http://www.cnblogs.com/rollenholt/articles/1907415.htmlhttp://pic.cnitblog.com/face/243280/20140807185513.png
呵呵。
1234567891011121314151617181920212223242526272829303132333435首先介绍一下双指针方法,在这里双指针就是指像指针的指针,比如你可以这样声明一个数组:int**p =newint*[num1];而对每一个*p(一共num1个*p)申请一组内存空间:for(inti=0; i<num1; ++i)p[i] =newint[num2];其中,num1是行数,num2是数组的列数。测试的源程序如下:#include <iostream>#include <iomanip>usingnamespacestd;intmain(){intnum1;//行数intnum2;//列数cout<<"Please enter the number for row and column: "<<endl;cin >> num1 >> num2;//为二维数组开辟空间int**p;p=newint*[num1];for(inti=0; i<num1; ++i)p[i] =newint[num2];for(intj=0;j<num1;j++){for(intk=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(intm=0;m<num1;m++)delete[] p[m];delete[] p;return0;}
1234567891011121314151617181920212223242526272829303132333435363738394041根据以上一、二维数组,可以推出三维数组的实现。以下是指针实现代码:#include <iostream>usingnamespacestd;voidmain(){int***p3;intx=3,y=2,z=2;p3=newint**[x];for(i=0;i<x;i++){p3[i]=newint* [y];for(intj=0;j<y;j++){p3[i][j]=newint[z];for(intk=0;k<z;k++){p3[i][j][k]=i*j*k;}}}for(intk=0;k<z;k++){for(inti=0;i<x;i++){for(intj=0;j<y;j++)cout<<p3[i][j][k]<<" ";cout<<endl;}cout<<endl;}for(inti=0;i<x;i++){for(intj=0;j<y;j++){delete[] p3[i][j];}delete[] p3[i];}delete[] p3;}
其实也是可以用一维数组实现的。比如:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546用一维动态数组表示二维、三维动态数组以下是程序代码:#include <iostream>usingnamespacestd;voidmain(){intm=3,n=4,l=2;int*p2;//将表示二维数组p2=newint[m*n];inti,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=newint[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(intk=0;k<l;k++){for(inti=0;i<m;i++){for(intj=0;j<n;j++)cout<<p3[k*n*m + i*n + j]<<" ";cout<<endl;}cout<<endl;}delete[]p3;}
呵呵,对吧。很高兴认识博主,希望可以做个朋友。我是吉林大学软件学院大二的。希望以后可以多多交流。呵呵。欢迎去我的博客转转。
-
很不错啊http://pic.cnitblog.com/face/u295621.jpg?id=18192833
-
若是这种情况该怎么delete 掉呢?
1234567int*b;intt = 1;while(t<INT_MAX/100){b =newint[4];t++;}
C++动态内存管理


540

被折叠的 条评论
为什么被折叠?




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