首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于string指针的有关问题,希望帮忙解释下,多谢

2013-09-06 
关于string指针的问题,希望帮忙解释下,谢谢!1:vector string * ps2:string s3:string s12 hels4:

关于string指针的问题,希望帮忙解释下,谢谢!
1:vector <string *> ps;
        2:string s;
3:string s12 = "hels";
        4:while(getline(cin ,s))
{
5:string * s1 = new string;
        6:*s1 = s;
7:ps.push_back(s1);
}
8:ps.push_back(&s12);
为什么已经初始化的sting字符串可以直接取地址赋值给指向string的指针,而通过程序运行初始化的sting字符串是像第6句那样初始化?而不能像第8句那么初始化? String 指针
[解决办法]

引用:
为什么不能写成 s1= &s 呢? 或者我直接第7句直接ps.push_back(& s)也不行呢?


s1= &s 也可以啊,只是意义不同:
*s1=s是把s的内容拷贝给s1所指的string
而s1=&s是让s1这个指针去指向s
[解决办法]
引用:
为什么不能写成 s1= &s 呢? 或者我直接第7句直接ps.push_back(& s)也不行呢?


同理,ps.push_back(& s)这么写在语法上是没有问题的,它的问题在于:
如果你每次循环都用ps.push_back(& s),那么它每次都只是把s的地址放进vector里,而s的地址是不会变的,最终导致vector里所有的元素都是相同的——都是s的地址,而这显然不是你想要的结果
而string * s1 = new string;
  *s1 = s;
  ps.push_back(s1);
这个写法,每次循环都new出一个新的string来,把当前s的内容拷贝给这个新的string,再把新string的地址放进vector里,所以循环多少次就有多少个string,这才是你想要的
[解决办法]
都改成动态分配的吧

vector <string *> ps;
string s;
string s12 = "hels";
while(getline(cin ,s))
 {
    ps.push_back(new string(s));//copy
 }
 ps.push_back(new string(s12));//copy

//...
记得释放哦


或者
vector <string> ps;
string s;
string s12 = "hels";
while(getline(cin ,s))
 {
    ps.push_back(s);//copy
 }
 ps.push_back(s12);//copy
//不用担心释放了


------解决方案--------------------


可以这么处理:


vector <string *> ps;
string s;
while(getline(cin ,s))
   ps.push_back(new string(s));

......
for(vector<string *>::iterator it= ps.beng();it!=ps.end();it++)
{
     delete *it;
}
ps.clear();


[解决办法]
引用:
1:vector <string *> ps;
        2:string s;
3:string s12 = "hels";
        4:while(getline(cin ,s))
{
5:string * s1 = new string;
        6:*s1 = s;
7:ps.push_back(s1);
}
8:ps.push_back(&s12);
为什么已经初始化的sting字符串可以直接取地址赋值给指向string的指针,而通过程序运行初始化的sting字符串是像第6句那样初始化?而不能像第8句那么初始化?


1. 首先6行的 s1 是一个指向string类型的指针,s本身就是string,*s1 = s 编译时能通过的,因为两边类型一直,string类类型 重载了运算符=, 是可以直接用=复制操作,而无需strcpy 
2 8行, ps.push_back(s1); 不是初始化, 是吧s1 这个指向string类类型的指针存p在push_back到这个vector中。 初始化是在 你的第一行就已经初始化了。

[解决办法]

其实,string 内部就包含一个指针,用vector <string *> ps完全多余。
这么处理更好:

vector <string > ps;
string s;
while(getline(cin ,s))
   ps.push_back(s);

......
ps.clear();


[解决办法]
引用:
突然想起一个问题呢,为嘛我是new定义的string *S1,释放的时候需要delete vector里的?

1)因为都 push_back到 vector了
2)因为delete 和指针名字无关,和;指针类型,指针值有关;
只要指针类型,指针值,是分配的那个,并且是第一次delete,就不会有问题。

热点排行