我正在做一些测试并解决了这个问题:
#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调用此函数 超出范围,因为这会导致未定义的行为。
答案 0 :(得分:3)
这是偶然和巧合地“正确”运作吗?
是
你自己给出了引用的理由
便携式程序绝不应该使用参数n调用此函数 超出范围,因为这会导致未定义的行为。
当v[10]
小于v.size()
时访问11
是未定义的行为,因此您的程序可能会崩溃或出现意外(有时看似正确)的输出。
cout
可能会以与访问std::string
不同的方式打印std::string::c_str
,因此cout
和printf
可能会产生不同的结果。