还是delete提问,顺便谢谢ubin

lingling1989r 2009-02-08 09:32:17
之前一个帖子没有解决:http://topic.csdn.net/u/20090128/22/be3ad768-1c3f-4590-8d04-8881364ded44.html
ubin给了我一个回复:



你的帖子中有如下提问,好像没人理会:
“我以为,delete []ap,就会把只要是ap指针new出来都东西一起消了。
那如果没错都话,谁能给我解释一下吗?我不明白它new出来都东西,用delete[]ap是怎样知道哪些是由ap指针new出来的呢?他们是怎么存储的呢?ap都指向是什么?”

如果是 delete ap; 的话编译器在解释这一句时,它很清楚两件事:其一、ap这个指针的类型,即它所指向类对象的大小;其二、ap这个指针的值,即它所指向类对象的首地址。
那么知道了内存的首址和大小,释放这个内存块也就不是什么难事了。你要纠正一个误解,调用一次delete只能释放一个对象!如果反复new的话,就需要反复delete,这是一一对应的关系,不可能在一次delete中释放以前所有new出来的对象,用delete[]也不行!变量ap只能存放一个对象的首地址,对它第二次赋值时,以前的值就丢失了!

delete[] 与 new[] 对应,其实你需要奇怪的是,在释放对象数组时同样也只是知道首对象的首地址,它是怎么推断出数组大小的!!!

但我还有疑问想确定一下:
因为“变量ap只能存放一个对象的首地址,对它第二次赋值时,以前的值就丢失了!”
那我若是这么写:
class A{};
list<A *>::alist;
A *ap;
ap=new A;
alist.push(ap);
ap=new A;
alist.push(ap);
//然后若此处我list<A*>::iterator it=alist.begin();去用我这个alist里的东西的话,是不是根本都没法用啊?
若是如此的话,我是不是只有每次New的时候,要写成ap=new A[++i];这样才能保证我使得重复用这个指针去new而又能存到list里去用?
最后再
for(int x=1;x<=i;x++)
{delete ap[x];alist.clear();}或者for(list<A *>::iterator it=alist.begin();it!=alist.end();++it){delete (*it);}

那这样行吗?
...全文
90 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingling1989r 2009-02-08
  • 打赏
  • 举报
回复
原来是这么回事,呵呵~~
arong1234 2009-02-08
  • 打赏
  • 举报
回复
当然不是这样,这里所谓的丢了,是指ap不再保存它的值,但是你的值在list里还有啊?那里又没有丢,你担心什么?如果push到list里后还要ap保存这个值,我们要list干吗?
new A[++i]根本就是语法错误

64,654

社区成员

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

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