BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #23244同步于 2007/12/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

C++primer上遇到的与指针有关的问题[求助]

simon2062
2007/12/20镜像同步7 回复
C++ Primer第四版中文版142页习题5.18 编写程序定义一个vector对象,其每个元素都是指向string类型的指针,读取该vector对象,输出每个string的内容及其相应的长度。 我写的代码有问题,就是输出显示是重复输出最后一次输入的字符串。 #include <iostream> #include <vector> #include <string> using std::vector; using std::string; using std::cout; using std::cin; using std::endl; int main() { vector<string*> pvec; string str; cout << "Please enter some strings(Ctrl+ C to end)" << endl; while (cin >> str) { string *ps = &str; pvec.push_back(ps); } vector<string*>::iterator iter = pvec.begin(); while (iter != pvec.end()) { cout << **iter << " " << (**iter).size() << endl; ++iter; } return 0; } 我发现问题是在第一个while那儿。因为实际最后容器里的指针都指向str,而str就是最后一次的输入值。 我看了习题解答。如下: //定义一个vector对象,其每个元素都是指向string类型的指针, //读取该vector对象,输出每个string的内容及其相应的长度 #include <iostream> #include <string> #include <vector> using namespace std; int main() { vector<string*> spvec; //读取vector对象 string str; cout << "Enter some strings(Ctrl+Z to end)" << endl; while (cin >> str) { string *pstr = new string; //指向string对象的指针 *pstr = str; spvec.push_back(pstr); } //输出每个string的内容及其相应的长度 vector<string*>::iterator iter = spvec.begin(); while (iter != spvec.end()) { cout << **iter << (**iter).size() << endl; iter++; } //释放各个动态分配的string对象 iter = spvec.begin(); while (iter != spvec.end()) { delete *iter; iter++; } return 0; } 这是我有点疑惑。他使用了貌似动态数组的东西。但我现在只在书里学到了动态数组。他这个貌似是动态指针。请问为什么他的这个代码就能解决我先前代码的问题。
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
maloco机器人#1 · 2007/12/20
string *ps = &str; string *pstr = new string; //指向string对象的指针 第一句代码,你的vector存的 string类型的指针 都是指向同一个string对象~~~ 而第二句,vector存的string类型的指针 每个都指向不同的string对象。
simon2062机器人#2 · 2007/12/20
谢谢! 我只在第四章里学到new用来创建动态数组。 现在突然发现在这道题后面的5.11节就介绍了这种new的用法。
simon2062机器人#3 · 2007/12/22
看完了第五章,知道如何动态创建单个对象,但是仍然不知掉动态创建单个对象的作用。 我想作用就是解决这道题的这种问题吧。但我仍然很疑惑,为何 while (cin >> str) { string *pstr = new string; //指向string对象的指针 *pstr = str; spvec.push_back(pstr); } 这一段就能使vector存的string类型的指针 每个都指向不同的string对象呢?
maloco机器人#4 · 2007/12/22
步骤一: 每次进入循环,pstr都是指向了一块新的内存 (因为在堆上 new了的一块新的内存赋值给pstr), 但是这块刚刚分配的内存里面的内容是未知的, 只有当 *pstr = str 后,str存储的内容赋值给了pstr指向的内存 (就是把str的内容赋值给那块new出来的内存), 这时候这块内存才有了内容 (等于str存储的内容)。 然后进行第二次循环, 首先cin>>str,str原来的内容被冲掉,并存入了新的cin进来的内容,接着重复步骤一。
simon2062机器人#5 · 2007/12/22
非常感谢。原来这就是动态指定单个对象的作用呀,可以每次循环都指定一个新的内存给其赋值。怪不得最后释放内存也要在循环里重复释放。 感觉这样用在循环里动态创建单个对象有创建动态数组的味道了。不过仿佛比动态指定内存还好用一点,不用指定维数。请问这样理解对吗? 【 在 maloco 的大作中提到: 】 : 步骤一: : 每次进入循环,pstr都是指向了一块新的内存 : (因为在堆上 new了的一块新的内存赋值给pstr), : ...................
difuk机器人#6 · 2007/12/26
堆内存 栈内存 的问题 我谈一下我的理解: 堆内存,由程序员维护管理,c中使用alloc 和free 函数进行,C++中使用new和delete操作符进行。当程序生命周期的结束,会被系统收回。 栈内存,由运行时系统维护管理,什么global,static,local阿都是在生命期以外会自动消亡。 他们得名于被使用的方式。
wakaka007机器人#7 · 2008/1/2
楼主继续学习