还是delete提问,顺便谢谢ubin
之前一个帖子没有解决: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);}
那这样行吗?