一道C++关于迭代器和指针用法的题

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string*>p;
string *p1=0;
while (cin>>*p1)
{

(p).push_back(p1);
}
return 0;
}
程序为何一运行就崩溃?如果需要在堆中开辟新内存空间,那么我要问为什么不能直接用栈的内存空间而非要用堆的空间?

怎么改才能正确输入字符串而不使程序崩溃 另外编译时还没有警告提示?..
不好意思 少段程序 上面那段程序之后加上这个
for(vector<string*>::iterator i=p.begin();i<p.end();++i)
{
cout<<**i<<endl;
cout<<strlen((**i).c_str())<<endl;
}
for( i=p.begin();i<p.end();++i)
{
delete *i;
cout<<"释放内存成功"<<endl;
}

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string*>p;
string *p1=new string();//分配空间即可
while (cin>>*p1)
{

(p).push_back(p1);
}
return 0;
}
你说为什么不能直接用栈的内存,如果p1是数组就可以用,下面这个也是对的
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string*>p;
string p1[1];
while (cin>>p1[0])
{

(p).push_back((string*)p1);
}
return 0;
}追问

我已经补上后面的程序了 你看看你这两段程序如果加上后面的程序 运行时会有什么问题出现?

追答

数组是不用释放内存的,但是释放内存一般不用迭代器,用vector自带的clear函数就行。
for( i=p.begin();i<p.end();++i)
{
delete *i;
cout<<"释放内存成功"<<endl;
}
这段改为
p.clear();
delete p1; //p1要释放,这个和vector无关,push_back是拷贝过去的。
p1=NULL;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-06-08
string*p1 = 0 修改为:string *p1= new string;

你没有给pi分配空间,就直接给他输入流是不对的。
第2个回答  2011-06-08
string *p=0 相当于 string *p=NULL; NULL的地址是我们不可进行赋值操作的,如果一定要在栈中开辟内存的话,应该把指针变量指向一个具体的地址
第3个回答  2020-02-09
下面是我收藏的关于指针的一个非常好的文档,讲的很深入,楼主要是感兴趣的中一般就不用指针而用迭代器比较方便,不易出错。不过迭代器仍然和指针有
相似回答