在线求助!!!有关C++中,list容器push_back的问题,代码如下:

#include<iostream>#include<list>#include<string>using namespace std;
class Course{ public: void read () {cin>>i>>marks;} int printMark()
{ return marks; } private: string i; int marks; };int main(){list<Course*> aa; list<Course*> ::iterator it; Course* a= new Course() ; do{
a->read(); aa.push_back(a); }while((a->printMark())>=0);for (it =aa.begin();it!=aa.end();++it) { cout<<"\t"<<(*it)->printMark()<<endl; } delete a; }

当我输入 aa 4 aa gjkaf -9 是 输出的却是 -9 -9 -9
在for (it =aa.begin();it!=aa.end();++it)处设置断点,查看后如下

为什么aa中每个对象元素都被附上gjkaf -9 了?
还有截屏里的 "ptr CXX0030: 错误: 无法计算表达式的值" 是什么意思?

a->read();//你是一次性给一个string类型的i和int类型的marks赋值,你cmd窗口当然也要成对出现,奇数个的时候是string类型,偶数个的应该是int类型。你第4个应该是给marks赋值,你却赋了一个gjkaf  当然不行。

  aa.push_back(a);//你push_back的a都是指向同一块内存地址,所以后面的覆盖了前面给marks赋的值。



ps:如果你只是想试试list是怎么用的程序可以这么改一下(内存泄露无所谓了,反正是测试):


//只要是输入的全是数字,那么你输入什么数字就会打印什么数字,不会覆盖

追问

你好,你这样do{..}while();每循环一次就会新申请一块内存,而上一次循环申请的内存还未释放吗?有没有办法能输出你截屏的那个样子,但是却不会导致内存泄露?我尝试把delete a放在do{..}while();中,即:
do{ a=new Course;
a->read();
aa.push_back(a);
delete a;
}while((a->printMark())>=0);
却不能得到正确的结果。我是初学者,很多东西都不能,望赐教,谢谢。

追答

在图上的为止加一个delete就可以了。不回内存泄露了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-30
你每次push_back进去的指针都指向循环外new出来的同一个对象,read()就把内容覆盖了……
至于it这个应该是你断的地方it没初始化,所以内部实现的值无法确定。
相似回答