我有类似
的东西struct functor
{
functor(){}
virtual int operator()()=0;
};
struct impl : public functor
{
int i;
impl(int ii) : i(ii) {}
virtual int operator()(){return i;};
};
void call(functor& f) {std::cout << f() << std::endl;}
class holder
{
public:
holder(){}
std::vector<functor*> dps;
};
class veer
{
public:
std::vector<holder> hs;
std::vector<impl> ds;
veer(){}
void add_h(int i)
{
ds.push_back(impl(i));
holder th;
th.dps.push_back(&ds.back()); //here
hs.push_back(th);
}
};
int main()
{
veer v;
v.add_h(10);
v.add_h(9);
for (auto ih: v.hs)
for (auto ifn : ih.dps)
call(*ifn);
return 0;
}
这段错误。对不起,我不能说它更简单,这是最简单的,最接近我的实际代码,因为我可以做到。我需要指向函数对象的指针向量。我的猜测是标记为//here
的行我发送了一个无效指针,但除此之外,我仍然试图解决这个问题。
答案 0 :(得分:2)
麻烦在于vector
is not guaranteed to keep the same storage:
如果新的size()大于capacity()那么所有的迭代器和 引用(包括过去的结束迭代器)无效。 否则只有过去的迭代器无效。
每次拨打add_h
时,您都可能会使std::vector<functor*>
中存储的所有指针无效。我不能想到一个用例来获得一个东西的矢量和一个指向同一顺序的指针的向量。你确定这是你需要的吗?
std::vector
倾向于按照所需空间的顺序使用某些东西,因此有时需要扩展其存储空间。在引擎盖下,它必须创建一个新数组,复制现有元素,并删除旧数组。当它这样做时,所有旧指针现在都指向delete
内存。