关于以下代码问题

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()); 这里有问题
...全文
312 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

64,282

社区成员

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

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