C++中new与delete问题学习
作者:网络转载 发布时间:[ 2015/10/13 10:37:50 ] 推荐标签:.NET 测试开发技术
一.new char与delete问题
1. 问题程序
#include <iostream>
using namespace std;
void main()
{
char* des = new char();
des = "testing!";
cout<<des<<endl;
delete des; //这个delete需要吗
}
2. 错误
当运行到delete时,程序出错!
3. 解答
v1
你用new申请了一个char空间,把它的地址保存在了des这个指针里面
然后你又把"testing!"这个常量字符串的地址赋给了des这个指针
于是,你之前用new申请的那个空间丢失了,在程序结束系统回收全部内存前,那个空间被标明被你使用但实际上你已经丢失它的地址没办法再使用它了,这是常见的内存泄露
delete出错理所当然,因为你delete的不是你new的那个空间。甲被乙骗了钱不能去法院起诉丙,丙是无辜的
v2
1.
char* des = new char();
应该只分配一个byte的空间,而后面的des = "testing!";我猜楼主的意图是要将"testing!"放入des所指向的空间,很显然实际上是放不下去的。之所以输出有没有问题,是刚好将"testing"的首地址给了des,这改变des的值,也是des = "testing!"中的des,和前面的char* des = new char();已经不同了。
4. 正确代码
V1
#include <iostream>
using namespace std;
void main()
{
char* des = new char[10];
memset(des, 0, 10);
strcpy(des, "testing!");
cout << des << endl;
delete des;
}
V2 严格版
#include <iostream>
using namespace std;
void main()
{
char* des = new char[10];
memset(des, 0, 10);
strcpy(des, "testing!");
cout << des << endl;
delete[] des; // new[]和delete[]对应。但由于char是基本数据类型,所以6楼那样写应该也是没有问题的
}
二.new int与delete
1. 程序
#include <iostream>
using namespace std;
void main()
{
//一维整型指针
int *a = new int [2];
for (int i=0;i<2;i++)
{
a[i] = 1;
}
for (int i=0;i<2;i++)
{
printf("%d
",a[i]);
}
delete[] a;
//二维整型指针
int **b = new int *[2];
for (int i=0;i<2;i++)
{
b[i] = new int [2];
}
for (int i=0;i<2;i++)
{
for (int j=0;j<2;j++)
{
b[i][j] = 2;
}
}
for (int i=0;i<2;i++)
{
for (int j=0;j<2;j++)
{
printf("%d ",b[i][j]);
}
printf("
");
}
for (int i=0;i<2;i++)
{
delete[] b[i];
}
delete[] b;
system("pause");
}
2. 程序运行正常
除char以外的基本数据类型,在进行指针释放时一般不用考虑太多,主要是因为没有字符串的赋值(实质是地址的赋值)。
三.小结
在new的类型中,涉及到地址赋值,要千万小心!
四、使用陷阱
new和delete成对使用,避免内存泄露,申请内存数组时使用的"[]"而非“()”。如下:
char * szData=new char(100); (错误)
char *szData=new char[100];(正确)
int**a = new int*[2];
for(int i=0;i<2;i++){
*(a+i) = new int[3]; //a[i] = new int[3];
for(int j=0;j<3;j++){
*(*(a+i)+j) = j; //a[i][j] = j;
}
}
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
cout<<"a["<<i<<"]["<<j<<"]="<<*(*(a+i)+j)<<endl;
}
cout<<endl;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11