我有一个类 A
可以响应 doSomething()
和一些子类 B
、C
和D
全部覆盖 doSomething()
。 B
特别有一个实例变量,它是标准库中的列表,并在响应 doSomething()
时向该列表添加元素。
在我的代码的某些部分,我创建了一个数组,其中包含指向 A
类型对象的指针。现在,如果我这样声明:
A* pointersToA[3];
pointersToA[0] = &B();
pointersToA[1] = &C();
pointersToA[2] = &D();
调用 pointersToA[0]->doSomething()
时,我得到一个 List insert iterator outside range
。
但是如果我这样做的话:
A* pointersToA[3];
B b = B();
pointersToA[0] = &b;
pointersToA[1] = &C();
pointersToA[2] = &D();
一切都按预期进行。
为什么会这样?
最佳答案
获取右值的地址几乎肯定迟早会导致问题(通常更早),并且在 C++ 中实际上是非法的(因此您的编译器在这方面并不是一流的)。地址不是对对象的强引用;因为 C++ 不是一种垃圾收集语言,B
、C
和 D
的值在使用它们的语句消失后立即消失执行。
对于您的使用,动态分配听起来像是最直接的方式:
std::array<std::unique_ptr<A>, 3> pointersToA {
std::make_unique<B>(),
std::make_unique<C>(),
std::make_unique<D>()
};
关于c++ - 列表插入迭代器超出范围 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110811/