C++-关于std::string赋值时的疑问?
bool _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString;
string strSub = subString;
//后面省略······
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我在其他论坛里得到了这个答案:
string strHost = hostString 是先调用string的复制构造函数,然后再调用复制操作符
string strHost = hostString.c_str() 是先调用string(char*)构造函数,然后再调用复制操作符
复制构造函数重新申请的地址,跟传进来的参数不是一个地址;
string(char)构造函数用的是char的地址,跟传进来的参数一个地址;
正常处理应该不会,出现这种情况想来想去有一个可能:之前用data或者c_str直接修改了string
比如之前这样用了:
strcpy((char*)hostString.data,"SHAN SHAN SS");
strcat(const_cast<char*>(pContact->strPingyinjx.c_str()),buffer);
string的原型是vector,所以string.length是用的vector.size实现的,这是个内部长度。你直接修改了data的话,长度是不会跟着变的。赋值的时候长度跟着赋值过来,出来的字符串就变短了。
直接操作缓冲区还有缓冲区溢出的危险,因为std::string内部的缓冲区不是无限大的,字符串太长就会溢出,而不会自动调整。
字符串连接可以使用operator+=或者append:
hostString = "SHAN SHAN SS";
pContact->strPingyinjx += buffer;
pContact->strPingyinjx.append(buffer);