c++指针问题(说不清楚是指针的什么问题)

licup 2009-03-19 02:49:07
char *a=new a[2];
a[0]='a';a[1]='b';
char *b=new b[3];
b[0]='a';b[1]='b';b[2]='c';
delete []a; //(1) right;
//a=NULL; //a分配的空间被释放了
a=b;

delete []a; //(2) right ,在这里b分配的空间也被释放了,然而这里delete的是a数组??
//a=NULL; //还有啊?就是一个new分配的指针不能被delete两次?
a=b; // 指针a在这里的性质是指向堆地址空间

delete []a; //(3) error

总是感觉这里很模糊,请那位朋友帮忙解释哈.
...全文
169 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaaa3105563 2009-04-01
  • 打赏
  • 举报
回复
顶上·····
CJoneL 2009-04-01
  • 打赏
  • 举报
回复
a和b都是指针变量,它们的值都是可以改变的
delete a; //释放a所指向的内容
a=b; //a现在存放的是b的地址
delete a; //现在释放的是b的内容
a=b; //此时b是一个野指针,因为它的内容已经被释放了
delete a; //这时a所指向的内容不确定,释放的话将导致程序崩溃或异常
mengde007 2009-03-19
  • 打赏
  • 举报
回复
char *a=new a[2];
a[0]='a';a[1]='b';
char *b=new b[3];
b[0]='a';b[1]='b';b[2]='c';
delete []a; //(1) right;
//a=NULL; //a分配的空间被释放了
a=b;

delete []a; //(2) 这里释放的是b的空间。//a=NULL; //就是一个new分配的指针不能被delete两次?不能,可能造成系统崩溃。
a=b; // 指针a在这里的性质是指向堆地址空间

delete []a; //(3) error

licup 2009-03-19
  • 打赏
  • 举报
回复
不好意思,是我写错了
真是不好意思!
hust_terry 2009-03-19
  • 打赏
  • 举报
回复
同意六楼的解释
liwenchao0309 2009-03-19
  • 打赏
  • 举报
回复
学习了!
jokenchang2000 2009-03-19
  • 打赏
  • 举报
回复

char *a=new a[2];//char *a=new char[2];
a[0]='a';a[1]='b';
char *b=new b[3]; // char *b=new char[3];
b[0]='a';b[1]='b';b[2]='c';
delete []a; //(1) right;
//a=NULL; //a分配的空间被释放了
a=b; //a指向b,所以下面一句释放的是b的空间

delete []a; //(2) right ,在这里b分配的空间也被释放了,然而这里delete的是a数组??
//a=NULL; //还有啊?就是一个new分配的指针不能被delete两次?
a=b; // 指针a在这里的性质是指向堆地址空间,a和b都释放了,都不能再被释放

delete []a; //(3) error 释放a或者释放b都是错的



pengzhixi 2009-03-19
  • 打赏
  • 举报
回复
a=b; //这里你已经将b的地址赋给了指针a

delete []a; //实际上你这里释放的是b指针所指的内存空间
xghuzd 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hairetz 的回复:]
char *a=new a[2]; // 写错了吧,是char *a=new char[2];
a[0]='a';a[1]='b';
char *b=new b[3]; //同上
b[0]='a';b[1]='b';b[2]='c';
delete []a; //(1) right; //释放a
//a=NULL; //a分配的空间被释放了
a=b;

delete []a; //(2) right ,在这里b分配的空间也被释放了,然而这里delete的是a数组?? //实质释放b地址
//a=NULL; //还有啊?就是一个new分配的指针不能被del…
[/Quote]
  • 打赏
  • 举报
回复
char *a=new a[2]; // 写错了吧,是char *a=new char[2];
a[0]='a';a[1]='b';
char *b=new b[3]; //同上
b[0]='a';b[1]='b';b[2]='c';
delete []a; //(1) right; //释放a
//a=NULL; //a分配的空间被释放了
a=b;

delete []a; //(2) right ,在这里b分配的空间也被释放了,然而这里delete的是a数组?? //实质释放b地址
//a=NULL; //还有啊?就是一个new分配的指针不能被delete两次?
a=b; // 指针a在这里的性质是指向堆地址空间

delete []a; //(3) error //等同于重复delete []b;肯定出错
fibbery 2009-03-19
  • 打赏
  • 举报
回复
delete 针对地址,而非针对变量。

第二个delete a;实际上删除的是b的空间,因为此时a等于b。
第三次delete a;实际上是第二次释放b最初分配的空间,当然会错误。
sagegz 2009-03-19
  • 打赏
  • 举报
回复

char *a=new a[2]; //这也对?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧