返回信息流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;
}
这是我有点疑惑。他使用了貌似动态数组的东西。但我现在只在书里学到了动态数组。他这个貌似是动态指针。请问为什么他的这个代码就能解决我先前代码的问题。
这是一条镜像帖。来源:北邮人论坛 / soft-design / #23244同步于 2007/12/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖
C++primer上遇到的与指针有关的问题[求助]
simon2062
2007/12/20镜像同步7 回复
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
string *ps = &str;
string *pstr = new string; //指向string对象的指针
第一句代码,你的vector存的 string类型的指针 都是指向同一个string对象~~~
而第二句,vector存的string类型的指针 每个都指向不同的string对象。
看完了第五章,知道如何动态创建单个对象,但是仍然不知掉动态创建单个对象的作用。
我想作用就是解决这道题的这种问题吧。但我仍然很疑惑,为何
while (cin >> str) {
string *pstr = new string; //指向string对象的指针
*pstr = str;
spvec.push_back(pstr);
}
这一段就能使vector存的string类型的指针 每个都指向不同的string对象呢?
步骤一:
每次进入循环,pstr都是指向了一块新的内存
(因为在堆上 new了的一块新的内存赋值给pstr),
但是这块刚刚分配的内存里面的内容是未知的,
只有当 *pstr = str 后,str存储的内容赋值给了pstr指向的内存
(就是把str的内容赋值给那块new出来的内存),
这时候这块内存才有了内容 (等于str存储的内容)。
然后进行第二次循环,
首先cin>>str,str原来的内容被冲掉,并存入了新的cin进来的内容,接着重复步骤一。
非常感谢。原来这就是动态指定单个对象的作用呀,可以每次循环都指定一个新的内存给其赋值。怪不得最后释放内存也要在循环里重复释放。
感觉这样用在循环里动态创建单个对象有创建动态数组的味道了。不过仿佛比动态指定内存还好用一点,不用指定维数。请问这样理解对吗?
【 在 maloco 的大作中提到: 】
: 步骤一:
: 每次进入循环,pstr都是指向了一块新的内存
: (因为在堆上 new了的一块新的内存赋值给pstr),
: ...................
堆内存 栈内存 的问题
我谈一下我的理解:
堆内存,由程序员维护管理,c中使用alloc 和free 函数进行,C++中使用new和delete操作符进行。当程序生命周期的结束,会被系统收回。
栈内存,由运行时系统维护管理,什么global,static,local阿都是在生命期以外会自动消亡。
他们得名于被使用的方式。