std::string赋值时的疑问

FlowFish 2012-10-09 02:57:51

bool _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString;
string strSub = subString;
//后面省略······
}

这是之前的代码,在调用时传入两个string的引用,然后赋值给strHost和strSub,可是赋值后strHost和strSub的值根本和引用的值不同,例如“SHAN SHAN SS”,出入后就变成了“SHAN SHAN ”。
但是当我将代码修改为如下:

bool _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString.c_str();
string strSub = subString.c_str();
//后面省略······
}

结果变成一样了。

请高手解释下,看了下以前的很多帖子,还是有点迷迷糊糊的
...全文
376 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlowFish 2012-10-09
  • 打赏
  • 举报
回复
谢谢各位帮忙,那能不能说下,在不修改传参类型的情况下,我该如何去修改现在的代码,或者说如何避免出现内存问题?
baichi4141 2012-10-09
  • 打赏
  • 举报
回复
简单地说,string自己管理所需内存,不建议直接访问其内存地址,严禁直接修改其内存空间
strcat(const_cast<char*>(pContact->strPingyinjx.c_str()),buffer);
这条语句中,strcat函数直接修改了strPingyinjx的内存,由此导致从这句之后,strPingyinjx无法正确管理其内存空间
之所以使用c_str()函数可以满足楼主的要求,是因为此时它们都将该内存区域作为C风格字符串处理,访问内存时遇到0结束符为止。但无论如何,内存越界已经造成,虽然常常不出明显问题,一出问题那就是大问题

所以再重复一次,使用std::string或者CString等等自己封装了内存管理的字符串类时,不推荐直接访问字符串内存,严禁直接修改字符串内存
HandanXiaoliang 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

C/C++ code
bool _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString;
string strSub = subString;
//后面省略····……
[/Quote]

当我胡扯,测试结果都不改变
void _IsPartOf( const string& hostString, const string& subString )
{
string strHost = hostString;
string strSub = subString;

strHost = "Func";
//后面省略······
}
void _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString.c_str();
string strSub = subString.c_str();

strHost = "Func";
//后面省略······
}

int _tmain(int argc, _TCHAR* argv[])
{
string str = "Main";
_IsPartOf(str,"");
_IsPartOfEx(str,"");

return 0;
}
Saingel 2012-10-09
  • 打赏
  • 举报
回复
strcat(const_cast<char*>(pContact->strPingyinjx.c_str()),buffer);
这句就导致strPingyinjx内存溢出
HandanXiaoliang 2012-10-09
  • 打赏
  • 举报
回复
    bool _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString;
string strSub = subString;
//后面省略······
}
bool _IsPartOfEx( const string& hostString, const string& subString )
{
string strHost = hostString.c_str();
string strSub = subString.c_str();
//后面省略······
}


string strHost = hostString 是先调用string的复制构造函数,然后再调用复制操作符
string strHost = hostString.c_str() 是先调用string(char*)构造函数,然后再调用复制操作符


复制构造函数从新申请的地址,跟传进来的参数不是一个地址;
string(char*)构造函数用的是char*的地址,跟传进来的参数一个地址;


仅个人看法


libinfei8848 2012-10-09
  • 打赏
  • 举报
回复
确定木有重写string operator=(const string&, const string&)?
FlowFish 2012-10-09
  • 打赏
  • 举报
回复
调用没什么特别的,如下:

//pContact是一个结构体
······
strcat(const_cast<char*>(pContact->strPingyinjx.c_str()),buffer);//这句应该是没影响的,但是不太确定,拿出来看下
······

_IsPartOfEx( pContact->strPingyinjx, strRule );
HAN-Kai 2012-10-09
  • 打赏
  • 举报
回复
楼主是怎么传参的呢?传参调用的代码能贴一下么。

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧