它可能在某个地方得到了答案,但我找不到正确的单词来搜索。
我有基本类
class B
{
protected:
std::vector<int> v;
public:
B(): v{} {}
void test()
{
v.push_back( 10 );
std::cout << v[0] << std::endl; // prints 10
}
};
儿童类
class C: public B
{
public:
C() {}
void print() { std::cout << v[0] << std::endl; } // error here
};
主要功能
int main()
{
B b;
b.test(); // initialized vector 10
C c;
c.print(); // error 139 here
return 0;
}
若我在基构造函数中初始化向量,并没有错误。
B(): v{ 10 } {}
我不明白为什么?我可能会做一些非常愚蠢的事情,-在错误上帮助我,我真的很感激
b
和c
是不同的实例,默认情况下矢量v
没有任何元素。在这种状态下读取v[0]
是超出范围的读取,将导致错误。
B::test()
函数将某些东西推送到向量,因此调用它将消除此错误。
int main()
{
B b;
b.test(); // initialized vector 10
C c;
c.test(); // call this to have v in c have something
c.print(); // error 139 hear
return 0;
}
该错误只是越界违规,因此是未定义的行为。在该线路之后
C c;
矢量c.v
为空。因此std::cout << v[0]
尝试访问一个不存在的元素。