C++迭代器难题

Eug*_*sky 1 c++ iterator

以下程序的输出是

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++背景的程序员的解释将不胜感激.

Kle*_*ist 5

在第一个示例中,您调用c_str()在-loop kvPair范围内声明的内容for.for退出循环时结果变为无效,因为它kvPair被破坏.

在第二个示例中,您将调用c_str()地图中的值.当地图被销毁时,结果仅变为无效,这在_tmain(...)返回时发生.

在第三个示例中,您调用c_str()临时(由强制转换创建对),并在printf("5...调用之前销毁该临时值.

说明

c_str()点返回由string它拥有的某个内存返回的指针被调用,因此当它string被销毁时,访问指针是未定义的行为.