从矢量中超出范围元素

时间:2015-07-14 09:11:54

标签: c++ vector

我正在做一些测试并解决了这个问题:

#include <stdio.h>

#include <vector>
#include <string>

class Person{
public:
    std::string name;

    Person(const char *name):
        name(name){
            printf("c-tor for %s\n", name);
        };

    void print(){
        printf(">> %s\n", name.c_str());
    };
};

int main(){
    std::vector<Person> v;

    v.push_back("Ivan");
    v.push_back("Stoyan");
    v.push_back("Dragan");

    v[10].print();
}

如果我使用std::cout执行此操作,则会崩溃。但是,如果我使用printf执行此操作,则会打印:

  Ivan的c-tor为Stoyan的c-tor担任Dragan的c-tor   &GT;&GT; (空)

这是偶然和巧合地“正确”运作吗?

  

便携式程序绝不应该使用参数n调用此函数   超出范围,因为这会导致未定义的行为。

1 个答案:

答案 0 :(得分:3)

  

这是偶然和巧合地“正确”运作吗?

你自己给出了引用的理由

  

便携式程序绝不应该使用参数n调用此函数   超出范围,因为这会导致未定义的行为

v[10]小于v.size()时访问11是未定义的行为,因此您的程序可能会崩溃或出现意外(有时看似正确)的输出。

cout可能会以与访问std::string不同的方式打印std::string::c_str,因此coutprintf可能会产生不同的结果。