关于以下代码问题

hjl0508 2016-11-04 07:37:50
有一段代码如下:

#include<iostream>
#include<string.h>
#include<string>
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include <tr1/unordered_map>

using namespace std;

int main()
{
tr1::unordered_map<string,string> test_map;
test_map["a"] = "1234\n5678\n4321\n8765";
test_map["b"] = "1233\n5677\n4322\n8766";

for(tr1::unordered_map<string,string>::iterator it = test_map.begin();it!=test_map.end();++it)
{
cout<<"value:"<<it->second<<endl;
string p_val(it->second);
cout<<"add:"<<&p_val<<" add2:"<<&(it->second)<<endl;
char* value = const_cast<char*>(p_val.c_str());
cout<<"char add:"<<&value<<endl;
char* flight=NULL;
char* out_ptr=NULL;
while((flight=strtok_r(value,"\n",&out_ptr)) != NULL)
{
value = NULL;
cout<<"val:"<<flight<<endl;
}
cout<<"after:"<<p_val<<endl;
cout<<"after2:"<<it->second<<endl;
cout<<endl;
}
}


这个我知道strtok_r这个函数会改变原字符串的内容,现在看来是会把分隔符去掉,
但是string p_val(it->second);这个应该是复制了一个字符串出来,就算strtok_r 函数改变了p_val 的值,但是不应该改变it->second的值,但事实是it->second 的值也被改变了,就是说容器中的内容被改变了。求解这是为什么?
是不是 char* value = const_cast<char*>(p_val.c_str()); 这里有问题
...全文
378 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
高分子 2017-08-31
  • 打赏
  • 举报
回复
请问一下楼主,你的qt winId 界面卡死的问题解决没有
paschen 版主 2016-11-04
  • 打赏
  • 举报
回复
引用 4 楼 hjl0508 的回复:
[quote=引用 3 楼 fefe82 的回复:] 21.4.7.1 basic_string accessors [string.accessors] const charT* c_str() const noexcept; const charT* data() const noexcept; 1 Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()]. 2 Complexity: Constant time. 3 Requires: The program shall not alter any of the values stored in the character array c_str() 返回 const char * 而不是 char * 就是不想让你改。
恩,我感觉这么用也不好,这是之前别人写的代码,他这个变量只用一次,后来逻辑改了,经过这个过程后容器里的内容变了。查了好久才找到这个问题,但看代码很难看出这里的问题,后来我就改用new char 和strncpy了[/quote] 对象的地址肯定是不一样的,我说的是对象中字符串的指针
fefe82 2016-11-04
  • 打赏
  • 举报
回复
引用 4 楼 hjl0508 的回复:
[quote=引用 3 楼 fefe82 的回复:] 21.4.7.1 basic_string accessors [string.accessors] const charT* c_str() const noexcept; const charT* data() const noexcept; 1 Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()]. 2 Complexity: Constant time. 3 Requires: The program shall not alter any of the values stored in the character array c_str() 返回 const char * 而不是 char * 就是不想让你改。
恩,我感觉这么用也不好,这是之前别人写的代码,他这个变量只用一次,后来逻辑改了,经过这个过程后容器里的内容变了。查了好久才找到这个问题,但看代码很难看出这里的问题,后来我就改用new char 和strncpy了[/quote] 看到 const_cast 就要多想几分钟
hjl0508 2016-11-04
  • 打赏
  • 举报
回复
引用 3 楼 fefe82 的回复:
21.4.7.1 basic_string accessors [string.accessors] const charT* c_str() const noexcept; const charT* data() const noexcept; 1 Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()]. 2 Complexity: Constant time. 3 Requires: The program shall not alter any of the values stored in the character array c_str() 返回 const char * 而不是 char * 就是不想让你改。
恩,我感觉这么用也不好,这是之前别人写的代码,他这个变量只用一次,后来逻辑改了,经过这个过程后容器里的内容变了。查了好久才找到这个问题,但看代码很难看出这里的问题,后来我就改用new char 和strncpy了
fefe82 2016-11-04
  • 打赏
  • 举报
回复
21.4.7.1 basic_string accessors [string.accessors] const charT* c_str() const noexcept; const charT* data() const noexcept; 1 Returns: A pointer p such that p + i == &operator[](i) for each i in [0,size()]. 2 Complexity: Constant time. 3 Requires: The program shall not alter any of the values stored in the character array c_str() 返回 const char * 而不是 char * 就是不想让你改。
hjl0508 2016-11-04
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
引用
是不是 char* value = const_cast<char*>(p_val.c_str()); 这里有问题
有可能,string的实现可能采用一种叫Copy-on-write的手段,以提高效率(具体可以网上搜索)。 这种实现下,你string p_val(it->second) 后的p_val 指向的仍然是 it->second字符串,并没复制,只有在你改写p_val时,才发生复制 这时你再强制转换的char*可能仍指向it->second
我也是这么认为的,但是我打出的p_val和it->second的地址是不一样的。。。。这就把我搞晕了。。。
paschen 版主 2016-11-04
  • 打赏
  • 举报
回复
引用
是不是 char* value = const_cast<char*>(p_val.c_str()); 这里有问题
有可能,string的实现可能采用一种叫Copy-on-write的手段,以提高效率(具体可以网上搜索)。 这种实现下,你string p_val(it->second) 后的p_val 指向的仍然是 it->second字符串,并没复制,只有在你改写p_val时,才发生复制 这时你再强制转换的char*可能仍指向it->second
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 全球数据治理的发展趋势; 数据合规相关的法规标准以及重点案例的收集; 数据安全领域的标准与产业应用实践; 数字转型时代中数据流转所面临的风险控制; 运用人工智能技术进行的大数据安全保障; 各类厂商提供的数据安全防护措施; 完整的数据治理总体方案; 针对数据安全的治理解决方案; 【行业权威机构推荐】数据安全治理的建设指导手册; 企业数据防止信息泄露的体系化咨询服务完整资料; 阿里云在大数据安全方面的实践经验分享; 大数据安全等级保护过程中遇到的挑战及应对策略; 以风险为基础的数据完整性管理实践指导文件; 数据安全管理的相关法规条例; CSA组织发布的大数据安全与隐私保护手册中文翻译版本; GDPR框架下的数据合规性要求; 通过数据资产管理视角探讨数据安全监管; 大数据安全治理的汇编资料(共计四篇); 大数据安全的相关标准规范; 大数据应用场景中的隐性隐私安全隐患; 大数据应用环境下的隐私保护及风险控制技术; 数字化时代背景下的隐私保护策略; 等级保护2.0标准下的数据安全解决方案; 国际上通用的数据管理能力成熟度评估模型; 华为公司在大数据安全管理方面的实践经验; 企业数据安全能力体系框架_数据安全能力成熟度模型的构建与实际应用; 企业数据管理领域的理论知识和实践操作; 从零开始构建企业数字化运营全流程白皮书; 数据安全领域的权威白皮书; 数据安全能力建设的实施指导手册; 数据安全治理领域的白皮书及配套演示文稿; 数据安全治理的具体实施方案; 数据安全的多维度综合防御体系; 数据跨境传输的安全解决方案; 数据安全治理的技术支撑架构; 金融行业数据安全治理模型及实践案例; 涵盖但...

65,211

社区成员

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

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