以下程序的输出是
1: foo strlen: 3
2: strlen: 0
3: foo strlen: 3
4: foo strlen: 3
5: strlen: 0
6: strlen: 0
Run Code Online (Sandbox Code Playgroud)
我不明白
1打印字符串,但2不打印来源:
#include "stdafx.h"
#include <map>
#include <string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
map<string, string> m;
m["foo"] = "bar";
const char * s;
for(map<string, string>::iterator it = m.begin(); it != m.end(); it++)
{
pair<string, string> kvPair = *it;
s = kvPair.first.c_str();
printf("1: %s strlen: %d\n", s, strlen(s));
break;
}
printf("2: %s strlen: %d\n", s, strlen(s));
for(map<string, string>::iterator it = m.begin(); it != m.end(); it++)
{
s = (*it).first.c_str();
printf("3: %s strlen: %d\n", s, strlen(s));
break;
}
printf("4: %s strlen: %d\n", s, strlen(s));
for(map<string, string>::iterator it = m.begin(); it != m.end(); it++)
{
s = ((pair<string, string>) (*it)).first.c_str();
printf("5: %s strlen: %d\n", s, strlen(s));
break;
}
printf("6: %s strlen: %d\n", s, strlen(s));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
更新对于具有很少C++背景的程序员的解释将不胜感激.
在第一个示例中,您调用c_str()在-loop kvPair范围内声明的内容for.for退出循环时结果变为无效,因为它kvPair被破坏.
在第二个示例中,您将调用c_str()地图中的值.当地图被销毁时,结果仅变为无效,这在_tmain(...)返回时发生.
在第三个示例中,您调用c_str()临时(由强制转换创建对),并在printf("5...调用之前销毁该临时值.
说明
由c_str()点返回由string它拥有的某个内存返回的指针被调用,因此当它string被销毁时,访问指针是未定义的行为.
| 归档时间: |
|
| 查看次数: |
284 次 |
| 最近记录: |